MVC上的书籍和文档只是使用有状态和无状态术语而堆积。老实说,我只是无法理解它的意思,书在说什么。他们没有提供一个示例来了解任何一种状态,而不仅仅是告诉HTTP是无状态的,并且与ASP.NET MVC一起使用时,Microsoft会与之相伴。我是否缺少一些基础知识,因为我无法理解什么是有状态的,为什么有状态的,无状态也是如此?

一个简单而简短的示例,例如按钮或文本框之类的控件,可以简化我想的理解。

#1 楼

无状态意味着HTTP尚未内置对状态的支持。例如您无法存储用户是否已登录或进行了其他操作。

最常见的解决方案是使用会话来解决该问题。这意味着您必须能够在每个响应或请求中包括一个会话标识符。这可以通过创建会话cookie或在所有链接中包括会话标识符来完成。

WebForms试图使所有这些透明(使用ViewState),而MVC则迫使您手动处理它。 >
在您的示例中,您提到了Buttons和TextBoxes。让他们保持状态的最简单方法就是停止回发整个页面。 MVC获得了对ajax(通过jQuery)的出色支持,如果您只想在当前页面上做某事,我建议您使用ajax。

评论


这意味着,如果我登录到网站,则我访问的每个页面都将在通过会话标识符或会话cookie呈现内容之前重新检查身份验证?

–潘卡吉·阿帕德(Pankaj Upadhyay)
2011年8月15日下午6:43

对,那是正确的。

– jgauffin
2011年8月15日在7:03

那么无状态是好是坏?

–卢卡斯
2014年4月2日在7:19

@ think123:由于您无需管理状态(例如,负载平衡等要容易得多),因此性能更高。由于您必须管理人工状态,因此这变得更加复杂。

– jgauffin
2014年4月3日在6:53



@jgauffin:执行者在这里是错误的单词。无状态的性能较差,因为您没有机会缓存​​状态并必须反复查找。它具有更高的可扩展性;这就是负载平衡的来源,而可伸缩性带来的好处可以弥补系统足够大时的性能损失。

–梅森·惠勒
15年8月7日在19:28

#2 楼

无状态-程序不维护任何内存(状态)

有状态-程序具有内存(状态)

为了说明状态的概念,我将定义一个有状态功能和无状态功能

无状态

//The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}


有状态

//The state is maintained by the function

private int _number = 0; //initially zero 

function int addOne()
{
    _number++;
    return _number;
}


正如其他人所说,http本质上是无状态的。因此,状态必须内置到您的应用程序中。为了维持无状态http协议上的状态,浏览器通常会在每次请求时发送会话标识符到服务器。对于每个请求,服务器都将像“啊,这是这个家伙”。然后可以基于此会话ID在服务器端内存或数据库中查询状态信息。

在纯无状态环境中,您不需要此会话ID。每个请求将包含服务器需要处理的所有信息。但是许多应用程序需要维护状态,以跟踪会话是否已通过身份验证以查看某些内容或跟踪用户在做什么。您不想为每个请求通过网络发送用户凭据。

评论


简短的问题:因此,如果会话ID被其他用户使用(即被盗),服务器将不知道这是其他人吗?

– mihai
2014年8月11日14:53



没错有多种保护用户身份的方法,例如使用https或httponly cookie。但是,如果用户的计算机受到威胁,则攻击者可能使服务器欺骗以为他们是用户。

–编码器
2014年8月12日15:37

+1可获得清晰明快的代码示例。我更加相信,大多数复杂的IT术语只能在上下文中理解。

–塞巴斯蒂安
2015年5月20日19:12



会话ID可能被盗的原因之一是您必须小心,而CMS之类的应用程序或OAuth之类的应用程序的构建方式会使此操作更加困难。

–艾琳
15年5月20日在19:13

对于每个请求,服务器都将像“啊,这是这个家伙”-最好说,在我看到的所有其他示例中

–拉斐尔·埃因(Rafael Eyng)
15年5月25日在19:42

#3 楼

无状态意味着没有对过去的记忆。每个事务的执行就好像是第一次完成一样。

statefull表示有过去的记忆。以前的交易会被记住,并可能影响当前的交易。

评论


这应该被授予答案。这是迄今为止最清晰,最精确的答案。

–莫格说要恢复莫妮卡
2014年12月4日在16:07

简单准确。

–伊万·伊夫科维奇(IvanIvković)
15年3月19日在13:57

对于任何已经知道差异的人来说都是准确的。

–拉斐尔·埃因(Rafael Eyng)
15年5月25日在19:43

#4 楼

在我看来,ASP.NET(有状态)和ASP.NET-MVC(无状态)之间的区别可以隔离到以下事实:第一个提供服务器端控件,而另一个不提供服务器端控件。值得注意的是,ASP.NET Web窗体方法旨在过渡用于事件模型驱动模型中的旧VB和VC ++程序员,使他们能够很好地快速学习遵循相同事件模型范式的Web编程,就像单击。一个按钮,瞧,您会触发一个事件!您现在要做的就是在事件处理程序中编写代码。因此,ASP.NET需要具有诸如视图状态和回发之类的概念来监视每次往返的服务器端控件的状态。

ASP.NET-MVC不使用服务器端。控制,因此它不必维护状态。 MVC模型将问题域分为三个分区,以便以简化的方式将数据传递到客户端。

总而言之,服务器端控件使它们在有状态和无状态方面有所不同。

#5 楼

@coder的确切答案之外。

状态的想法是记住以前的数据。例如,您在服务器上有一个列表控件,其值是“ A,B,C”和选择“ A”。该列表将转到客户端浏览器。您选择“ B”。并发回到服务器。您如何知道该值已更改?


ASP.NET
Microsoft在ASP.NET中使用术语ViewState。开发人员对此有很大的误解。
ViewState在<input type="hidden" value="base64 encoded" />中保留列表的所有初始状态:值“ A,B,C”并标记为“ A被选中”。发送ViewState并将“ B被选中”到服务器。 ASP.NET恢复列表的初始状态并应用新的“ B”选择。
这样做是为了吸引WinForms开发人员(@Ronald提到)。在Web服务器上,您可以订阅列表更改listObject.Changed += OnChanged
ASP.NET MVC
ViewState的问题是大小。多年来,.NET开发人员被迫传输无用的信息,例如每次往返都包含20个控件的状态。
新方法是仅发送新的和较小的“ B”值。
跟踪从“ A”到“ B”的更改,然后自己实施。使用javascript并发送“是A,现在是B”。或者在SQL Server中按ID保存和检索状态。

ASP.NET MVC和ASP.NET实现身份验证和兑现的状态。因此,说ASP.NET MVC完全无状态是不正确的。

答案中提到的内存是“记住”,不是计算机内存。
可以通过将数据存储在文件系统,SQL Server或计算机内存中来实现状态。


评论


请保持建设性并在减号之前解释错误

– Artru
2015年8月8日23:47

#6 楼

有状态操作会修改或需要系统的某些状态,而无状态操作则不会。

有状态文本框的示例是先前在StackExchange上编辑的注释-该文本框需要显示您以前的注释,并且知道接收和处理您的输入所涉及的后线程。邮件应用程序而不会保留任何信息。

评论


典型的“留下您的电子邮件地址和消息,我们会尽快回复您”的表单也是无状态的。当您提交表单时,服务器不在乎您从何处获取它,它只是将数据复制到某些客户服务待办事项列表中,而忽略了它。

– StarWeaver
2014年12月4日上午11:53