Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何使我的Web应用程序成为无状态的,但仍能做一些有用的事情?_Asp.net_Rest_Webforms_Stateless - Fatal编程技术网

Asp.net 如何使我的Web应用程序成为无状态的,但仍能做一些有用的事情?

Asp.net 如何使我的Web应用程序成为无状态的,但仍能做一些有用的事情?,asp.net,rest,webforms,stateless,Asp.net,Rest,Webforms,Stateless,我看过这个建议 理想情况下,web应该遵循REST原则,并且完全无状态。因此,单个URL应该标识单个资源,而不必保留每个用户的导航历史记录 …我读了维基百科的页面,听起来很不错,但我不知道如何真正实现它。我使用的是ASP.NETWebForms,不是MVC 例如,在我即将构建的应用程序中,我需要我的用户在我允许他们做任何事情之前登录。在他们被允许做很多有用的事情之前,他们必须跳过一些障碍——比如接受T和C,并确认他们的基本细节没有改变。最后,他们被允许做一些他们真正想做的事情,比如购买产品 在我

我看过这个建议

理想情况下,web应该遵循REST原则,并且完全无状态。因此,单个URL应该标识单个资源,而不必保留每个用户的导航历史记录

…我读了维基百科的页面,听起来很不错,但我不知道如何真正实现它。我使用的是ASP.NETWebForms,不是MVC

例如,在我即将构建的应用程序中,我需要我的用户在我允许他们做任何事情之前登录。在他们被允许做很多有用的事情之前,他们必须跳过一些障碍——比如接受T和C,并确认他们的基本细节没有改变。最后,他们被允许做一些他们真正想做的事情,比如购买产品

在我看来(我来自富客户的高度有状态的世界),我需要状态来记录他们所做的事情,并从中推断他们被允许做什么。我不知道如何支持他们(比如)将BuyaProductURI添加到书签中。当他们到达书签时,我如何知道他们是否已登录,是否同意T和C,以及他们是否尽职尽责地检查了基本细节


我喜欢应用程序无状态的想法,部分原因是它似乎完全解决了“当用户点击后退和前进按钮时,我该怎么办?”的问题,我不知道如何才能让它正常工作。我觉得我缺少了一些真正基本的东西。

建议并不是说应用程序应该是无状态的,而是说应用程序中的资源应该是无状态的。也就是说,一个名为“www.mysite.com/resources/123”的页面将始终表示相同的资源,而不管哪个用户正在访问它,也不管他们是否登录

(您可能会拒绝未登录的用户访问这一事实是另一个问题——问题在于Uri本身并不依赖于用户特定的数据来工作。)

例如,违反这一规则的网站是这样的:你导航到一个产品页面,通过电子邮件将Uri发送给你的朋友,然后单击它,他们会看到一条类似“对不起,你的会话已过期”或“此产品不存在”或类似的消息。发生这种情况的原因是Uri包含特定于用户在站点上的会话的内容,如果其他用户尝试使用该链接(或稍后使用同一用户),则该链接不再有效

因此,您的应用程序始终需要某种形式的状态,但在何处实现该状态是一个重要因素


希望这有助于透露一些信息

如果你想制作Web表单,那很酷。如果你想休息,那也很酷。但出于对一切神圣事物的热爱,请不要试图坚持使用Web表单休息的原则

为了进一步澄清这一点,我不认为webforms是REST的明智选择,因为webforms所基于的概念模型是将web抽象出来的模型。它是为了模拟VB开发模型而构建的


REST支持HTTP和web应用程序的分布式特性。这两种方法不兼容。

问题是:REST是关于无状态协议上的有状态通信。这并不是说REST是无状态的。WebForms允许您在请求之间保留状态。为什么这是必要的?它让您可以使用向上/向下按钮对列表中的项目进行排序,而无需每次单击都更新基础资源。你不需要那个。您可以只放置资源表示形式,使其看起来正确,或者使用JavaScript编辑您的表示形式,然后在您满意后在末尾进行放置。(请注意,我使用的是PUT,而不是POST。您真正要做的是替换表示,以便future获得正确的状态。)

WebForms使用POST处理所有内容。当你正在创建一个新的项目并且不知道它将在哪里时,你应该只发布到一个URL。如果您知道它的url,那么应该使用PUT来创建或替换。如果您需要中间步骤,比如购物车,那么您应该为这些中间步骤创建资源表示。您的浏览器和服务器通过在彼此之间传递完整表示进行通信。它是简单的请求/响应消息传递


WebForms不鼓励这样做。您可以在WebForms中构建RESTful系统,但是默认模型会将您从它推向RPC方法。我可以想到两种方法:(在这种情况下,你应该真正考虑MVC)或使用几乎所有的ASHX文件。回发模型很好地消除了使用真正的WebForms/.aspx进行真正REST的任何真正希望(即,PUT和DELETE始终是POST,因此REST模型失败)。

cookie似乎是您问题的答案。您可以使用.net身份验证提供程序,它将设置cookie,您的应用程序可以检查cookie,如果他们要购买任何东西,则需要cookie


您想要尝试和避免的事情是在服务器上保留它们的状态表示,即会话cookie。这将使扩展更加困难。

可以维护资源状态。“无状态禁止”只是指会话状态

以下是一段摘录:

接下来,我们将向客户机-服务器交互添加一个约束: 通信在本质上必须是无状态的,如 第3.4.3节(图5-3)中的客户端无状态服务器(CSS)样式, 这样,从客户端到服务器的每个请求都必须包含 了解请求所需的信息,并且不能 服务器上任何存储上下文的优势。会话状态为 因此完全由客户负责


为什么?如果它当前正在工作,为什么要更改?Web应用程序往往需要有状态,因此需要会话和cookie。啊-它还没有构建,所以不能工作。我很瘦