

我应该怎样调用一个支持会话状态并在多个请求中维持会话的Web服务?
在根据SoapHttpClientProtocol得到的Web服务代理类中,有一个叫做CookieContainer的属性。如果你将它初始化为一个System.Net.CookieContainer类型的实例,它将保存那些返回给客户程序的Cookie。当带有同样的cookie容器实例的同一个代理被用来调用服务的方法时,它将cookie容器中的cookie进行序列化,作为组成HTTP头的一个属性放到请求中。在调用支持会话状态的方法之前,应该建立一个CookieContainer并初始化代理,如下:
System.Net.CookieContainer cookies = new System.Net.CookieContainer();
localhost.SessionService1 svc = new localhost.SessionService1();
svc.CookieContainer = cookies;
svc.UpdateHitCounter();
这有一个例子Demo,你可以从这里下载http://www.dotnetdashboard.net/downloads/WSSessionCookie.zip。
需要注意的事,一个Cookie容器的实例的生存范围是程序的整个生命周期。如果你给一个代理分配了一个新的Cookie容器,先前保存的会话ID(或其他cookie)将不会再和请求一起传递。
注意:我一般上不推荐在Web服务中使用会话状态。一个典型的使用会话状态的场景是用它来保存登录状态,这样在会话中只需要一次登录。然而,这样保持一个登录状态并没有提供足够的安全性来防止回复攻击(replay attack)或者在通信网络上截取会话ID。OASIS的Web服务安全标准描述了怎样安全地传递数据,包括具有足够的过期规则的基于会话的数据。此外它们描述了如何加密数据和对数据进行签名,以保证数据不会被篡改。如果想了解其他类型的基于会话的数据传递,请查看WS-SecureConversation、WS-Trust和SAML标准。