在Web Service中使用ASP.net状态保持(1)_Windows教程
简介
有许多聪明的办法可以解决HTTP协议的无状态问题,例如对每个请求重复发送应用程序数据包、使用HTTP认证机制来将请求映射到特定的用户、使用Cookie来存储一系列请求的状态等。在ASP.net技术中提供了一个非常有效的方案来保持状态,该方案隐藏了所有高难度的,具有挑战性的工作的细节,用户只需简单地使用System.Web.SessionState.HttpSessionState类。同时,你也可以像在ASP.net程序地Web页面(.aspx)中一样在Web Service的方法中使用这个类,只有一点小小的不同。
ASP.net的Session对象概述
ASP.net的Session状态信息在根本上通过两个机制保持。其一是使用Cookie。当客户端发送一个请求到服务器端时,服务器将发回一个附加HTTP Set-Cookie头的响应信息,而Cookie的值就是以键/值对的形式保存在该信息里边。在对同一服务器的所有的同步请求中,客户端在HTTP Cookie头中发送Cookie键/值对。然后服务器可以将并发的请求同初始的请求对应起来。ASP.net使用一个保存会话的ID的cookie来保持会话状态。该ID标识被用来为特定的用户找到与其对应的HttpSessionState类的实例。类HttpSessionState仅仅提供了一个通用的数据集,你可以在其中保存你需要的任何信息。
ASP.net用来保持状态的另外一个机制工作时无须使用Cookie。一些浏览器被用户设置为禁止使用cookie或者干脆就不支持Cookie,ASP.net提供了一种机制来解决这个问题,它的主要原理是将一个请求重定向到一个包含ASP.net状态ID的URL。当该请求被接受到时,这个嵌在URL中的ID被截取下来,服务器通过该ID找到合适的HttpSessionState类的实例。这种方式在HTTP协议的使用GET方式的请求中工作的很好,但是在.net的XML Web Service代码中会出现问题。
必须指出的是,有些时候把信息直接存储在Cookie中要比存储在Session中更好。避免使用Session可以节省服务器资源,而且你也无须考虑一些烦人的问题,比如定位一个特定的Session对象、Session对象因为请求的长时间的延迟而被移除或者在服务器上没必要地保留直到过期。然而,如果你有一些包含你不希望与你提供的服务的使用者共享的执行信息,或者有一些你不希望通过未加密的信道传输的私有数据,或者你认为将这些数据插入HTTP协议头中是不切实际的,那么你就应该使用ASP.net中的HttpSessionState,它将使你轻松解决这些问题。HttpSessionState类返回一个索引键,用以将一个特定的用户映射到一个为该用户保存信息的HttpSessionState类的实例。总之,无论是ASP.net的HttpSessionState类还是HTTP的Cookie都可以在ASP.net Web Service中使用。
在XML Web Service中使用基于HTTP的机制来实现状态保持的理由
在SOAP请求中有许多方法来保持状态。一个切实可行的方法就是在SOAP头中包含一些像ASP中的会话ID的信息,然而问题在于你不得不:
1) 仍然要自己编写服务器端代码。
2) 确信你的客户会像对待HTTP Cookie一样对待你的包含会话ID的SOAP头并且将它附加到每个请求中回传给你。
当然有很多时候使用SOAP头的方法会很方便,但是也有很多时候还不如使用基于HTTP协议的方法。
- 相关链接:
- 教程说明:
Windows教程-在Web Service中使用ASP.net状态保持(1)。