我们可以使Restful webservice有状态

时间:2013-11-17 14:18:25

标签: web-services rest soap

我一直在阅读有关Restful webservices无状态的信息。 我还可以看到,大多数基于Soap的Web服务也是无状态的,如果需要可以使其成为有状态,并使它们成为有状态将取决于实现。  因此,如果基于SOAP的Web服务是有状态的,那么每次请求都会传递会话ID,以继续进行会话。

我的查询是为什么不能用Restful webservices做同样的事情,我想我应该能够实现一个web服务,它可以继续使用相同的会话,其中会话ID通过Restful webservice制作是有状态的。

所以我的问题是,RestFul webservices是一个概念,其指导原则是不使它们成为有状态的吗?或者会在Restful网络服务库(如泽西岛)中检查以阻止人们这样做?

3 个答案:

答案 0 :(得分:13)

REST的无状态性旨在确保应用程序可以很好地扩展。您可以添加状态,但在可伸缩性方面需要权衡。

向REST添加状态的最常见原因之一是进行身份验证。建立安全连接后,可以将安全cookie发送给客户端。然后,客户端将此cookie添加到会话的所有请求中。服务器维护状态,然后根据cookie为每个请求加载该状态。

考虑一个简单的网页。如果您不维护状态,则可以建立反向代理,通过URL将页面缓存在内存中,并将该资源分布到多个服务器上以进行加载。如果现在将当前登录用户的名称添加到该网页,则无法再缓存任何内容(至少在最基本的HTTP级别)。现在只能使用身份验证cookie和URL来缓存响应。

答案 1 :(得分:1)

只要我知道,我们(.net开发人员)可以在wcf中使用WS-binding来建立有状态的Web服务。

答案 2 :(得分:0)

默认情况下,Web服务(无论是Rest还是SOAP)都是无状态的。但是在某些情况下,要求它必须是有状态的。 OASIS提供的Web服务资源框架(WSRF)可用于使SOAP Web服务成为有状态的。将ResourceProperty属性添加到端点,将ResourceProperty操作添加到WSDL,并将其跨Web服务传递。

Rest进行状态转移并使其具有状态,我们可以使用客户端或db持久化会话状态,并将其作为标题或方法参数中的属性跨Web服务调用进行转移。