为什么MVC是无状态的 - 如何解释?

8
在向我的学生解释ASP.NET MVC的概念时,我说到:

MVC是无状态的。它建立在另一个无状态的协议——HTTP和HTTPS之上。

但是有一个学生插话问道:

你说MVC是无状态的。

无状态协议不关心服务器是否返回响应。但是,在ASP.NET MVC框架中,你发出请求并等待响应。既然你要等待响应,这就应该被称为有状态服务。那么你怎么能把它称为无状态服务呢?

我真的陷入了困境,不知道如何回答这个问题。

你有什么想法吗?


7
我不知道MVC是一种协议。 - JJJ
@Juhana:没错。已经删掉那个词了 :) 是的,框架协议之间是有区别的。 - now he who must not be named.
4个回答

22

MVC不是无状态的,HTTP却是。

HTTP是无状态的,并不意味着它是“发完即忘”。客户端需要等待响应。它是无状态的,也就是说两个连续的请求没有任何关联。

可以使用会话来模拟状态,例如使用cookie。


2
HTTP服务器是无状态的,而HTTP客户端则从未如此。 - deerchao
@deerchao 你是什么意思? - CodeCaster
例如,cookie 必须由客户端记住,而不是服务器。 - deerchao
1
当使用会话时,服务器也会维护状态。 - CodeCaster
@CodeCaster:谢谢。解释得很好。第二行加一。 - now he who must not be named.
@CodeCaster 我认为这并不是必要的。考虑到服务器返回客户端访问次数,它所需要做的就是解析存储在cookie中的先前请求计数,加上1,并发送一个新的cookie回来。 - deerchao

7
这个问题中,另一个学生所声称的断言是错误的。像HTTP这样的无状态协议确实关心它是否得到(或从未得到)响应!

【无状态协议】将每个请求视为独立的事务,与任何先前的请求无关,因此通信包含【独立的请求和响应对】。

当然,MVC甚至不是一种协议...但是可以扩展相同的概念。只要所有信息都编码在"对"的请求和响应中,它就是"无状态的"。在实践中,大多数用法并非真正无状态。

0

MVC不是协议,而是一种软件架构模式。

另一方面,HTTP是一种协议。

如今,MVC模式在许多Web框架中非常流行。这些Web框架和其他Web框架用于开发Web应用程序。在Web应用程序的上下文中,HTTP是一种应用程序协议,用于浏览器与托管Web应用程序的服务器之间的通信

事实上,HTTP的本质是无状态的。在HTTP中没有任何关于状态的概念。因此,在许多Web框架中,有不同的方法来实现状态的概念。例如,在ASP.NET Web Forms中,为此开发了ViewState

话虽如此,MVC与HTTP的无状态本质无关。


能否请下投票者解释一下为什么要给我点踩?提前感谢。 - Christos
1
不是我点的踩,但你把MVC模式和ASP.NET MVC框架搞混了。 - JJJ
@Juhana 我只是提到了MVC作为一种模式,并没有涉及到它在ASP.NET中的使用,结果就是ASP.NET MVC。因此,我使用了“Web框架”这个词组,而不是指特定的一个,比如ASP.NET MVC,Django,RoR等等。 - Christos
1
我的观点是,你的回答解释了MVC模式是否具有状态,但问题根本不是关于MVC模式的。OP使用“MVC”作为“ASP.NET MVC框架”的简称。 - JJJ
@Juhana,是的,我明白你的意思。这可能是我的错,但我试图更加通用,因为这不是ASP.NET MVC特定的问题,正如问题所述。感谢您的评论。 - Christos

0
请记住,模型-视图-控制器架构的概念有很多不同的实现方式。没有“正确”的MVC。ASP.NET MVC也不是模型-视图-控制器模式的“完美”实现!

除了考虑有状态/无状态MVC之外,还可以通过职责来理解MVC:

视图不允许直接更改模型的状态 - 只能通过控制器进行更改。尽管只能用于查看(或者拥有一个不是官方模型的副本),但视图仍然可以直接访问模型。

模型应该存在于自己的世界中,不应该引用控制器或视图。

控制器控制模型的状态和访问。


它们之间的互动方式可以非常不同(例如基于平台)...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接