如何使我的Web应用程序无状态但仍然做一些有用的事情?

时间:2010-06-10 16:24:51

标签: asp.net rest webforms stateless

我见过这个建议......

  

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

...我读了维基百科页面http://en.wikipedia.org/wiki/REST,这听起来不错,但我不知道如何实际实现它。我正在使用ASP .NET Webforms NOT MVC。

例如,在我即将构建的应用程序中 - 我需要我的用户登录才允许他们做任何事情。在他们被允许做很多有用之前,他们必须跳过几个箍 - 比如接受T和C并确认他们的基本细节不变。最后他们被允许做他们真正想要的东西,比如BuyAProduct!

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

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

5 个答案:

答案 0 :(得分:23)

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

(您可能拒绝未登录的用户访问这一事实是一个单独的问题 - 重点是Uri本身不依赖于特定于用户的数据。)

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

因此,您的应用程序仍然需要某种形式的状态,但实现该状态是重要因素。

希望有助于减少一点光明!

答案 1 :(得分:12)

如果你想做网页表单,这很酷。如果你想做REST也很酷。但请为了对神圣事物的热爱,请不要试图遵循使用Web表单的REST原则。

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

REST包含HTTP和Web应用程序的分布式特性。这两种方法不兼容。

答案 2 :(得分:2)

维护资源状态是可以的。 “无国籍禁令”仅指会议状态。

以下摘自Roy Fielding's seminal REST derivation

  

我们接下来为客户端 - 服务器交互添加一个约束:   沟通必须是无国籍的,就像在   第3.4.3节(图5-3)的客户端无状态服务器(CSS)样式,   这样从客户端到服务器的每个请求都必须包含所有   理解请求所必需的信息,不能采取   服务器上任何存储上下文的优点。会话状态是   因此完全留在客户端。

答案 3 :(得分:1)

这就是事情:REST是关于无状态协议的有状态通信。这不是REST无国籍。 WebForms使您可以在请求之间保留状态。为什么这有必要?它允许您使用向上/向下按钮对列表中的项目进行排序,而无需每次单击都更新基础资源。你不需要那个。您可以只是PUT资源表示,使其看起来正确或使用JavaScript编辑您的表示,然后在您满意后在最后执行PUT。 (注意我使用了PUT,而不是POST。你真正在做的是替换表示,以便将来的GET检索正确的状态。)

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

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

答案 4 :(得分:1)

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

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