为什么MVC无国籍 – 如何解释?

同时向我的学生解释ASP.NET MVC的概念

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

但是一名学生打断了他的话,

你告诉MVC是无状态的

无状态协议从不关心响应是否从服务器返回。 但是,在ASP.NET MVC框架中,您发出请求并等待响应。 由于您等待响应,因此应将其称为有状态服务。 你怎么称它为无国籍服务呢?

我真的被困了,想知道该问题的答案。

有任何想法吗?

MVC不是无状态的,HTTP是。

HTTP无国籍并不意味着它是火和忘记。 客户端确实等待响应。 在两个连续的请求没有任何关系的意义上,它是无国籍的。

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

问题中的断言,其他学生声称错了。 像HTTP这样的无状态协议 确实关心它是否得到(或永远不会得到)响应!

[无状态协议]将每个请求视为与任何先前请求无关的独立事务,以便通信由独立的请求和响应组成。

当然,MVC甚至不是协议……但可以扩展相同的概念。 它是“无状态的”,因为所有信息都在请求和响应中编码为“对”。 在实践中,大多数用法并非真正的无国籍。

MVC不是协议是软件架构模式。

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

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

实际上,HTTP的本质是无状态的。 HTTP中没有任何state的概念。 出于这个原因,在许多Web框架中,我们尝试实现state概念的方式有很多种。 例如,在ASP.NET Web FormsViewState就是出于这个原因而开发的。

话虽这么说,MVC与HTTP的无状态特性无关。

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


否则考虑有状态/无状态MVC。 通过思考责任可以理解MVC:

不允许View直接更改模型的状态 – 仅通过Controller。 该视图仍然可以直接访问模型,但仅用于查看(或通过拥有非官方模型的副本)。

模型应该存在于自己的Universe中,而不是对控制器或视图的任何引用。

Controller控制状态和对Model的访问。


它们如何相互作用,可以以非常不同的方式实现(例如基于平台)……