凡是有使用微软ASP或ASP.NET开发过web应用程序经验的人都知道,session对象可以来维护状态。那么,ASP.NET Web Services是不是也可以使用Session来维护状态呢? 答案是肯定的。这篇文章就是要简单的跟大家介绍在ASP.NET Web Services中如何来设定使用Session(HttpSessionState),以及ASP.NET Web Services的客户端该如何才能让此Session正常运作来维护状态。
ASP.NET Web Services预设并未支持Session,所以在Web Services程序代码中不能直接使用Session,如果要使用,则必须先做一些设定。首先请确认web.config组态设定文件当中<sessionState>的mode属性值不是Off,如果是Off,则Session不会运作,后续的其它设定也不会有作用。其次须设定Web Services对象类别继承System.Web.Services.WebService类别。继承此类别让Web Services类别可以直接使用ASP.NET物件,如Session、Application等。最后,在方法宣告的< WebMethod ()>属性 (Attribute)中加入(EnableSession:=True)即可。
下面是一个ASP.NET Web Service使用Session的简单例子。在这个例子中,如果Session发挥维护状态的效果,则同一使用者每呼叫一次Web Service的Counter方法,回传值会以加一的方式递增。
<WebService(Namespace:="http://127.0.0.1/webServices/")> _
Public Class sessionService
Inherits System.Web.Services.WebService
<WebMethod(EnableSession:=True)> _
Public Function Counter() As Integer
Dim count As Integer
If Session("Count") Is Nothing Then
count = 1
Else
count = Session("Count") + 1
End If
Session("Count") = count
Return count
End Function
End Class
通常在完成了上面一个Web Service后,开发者会在IE浏览器中进行测试,结果确实可以得到预期中Session发挥了维护状态的效果。但是,Web Services并不是开发来让人用浏览器浏览的,而是由客户端程序来呼叫使用的。在客户端程序中叫用上面这个Web Service时,Session是否还会发挥效果呢? 答案还是肯定的,但是它却不像用浏览器叫用一般的简单直接,而是有些事情必须注意的。
下面是一个呼叫上面这个Web Service的简单范例。 做法是透过在.NET Framework里建立呼叫Web Service的Proxy代理程序(WsNamespace.sessionService)来呼叫。
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim ws As New WsNamespace.sessionService()
Dim count As Integer
count = ws.Counter()
Label1.Text = count
End Sub
Session的运作预设是使用Cookie来存放和传递辨识客户端的SessionID,如果没有Cookie的配合,则依预设的做法,Web Services无法透过SessionID来辨识使用者,如此便造成Session无法运作。在IE浏览器中进行测试Web Services时,通常浏览器都会支持Cookie,也因此Session可以正常发挥效果,但在客户端程序中呼叫Web Services时,则必须在客户端程序中利用CookieContainer来存放Cookie,如此才能传递SessionID来支持Session的运作。下面的例子就是改写前面的范例,在代理程序中设定CookieContainer。
‘产生cookieContainer对象实例
Private CookieCnt As New System.Net.CookieContainer()
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim ws As New WsNamespace.sessionService()
‘将CookieContainer对象实例设给呼叫Web Services的Proxy来存放Cookie
ws.CookieContainer = CookieCnt
Dim count As Integer
count = ws.Counter()
Label1.Text = count
End Sub
执行这个范例将可得到预期中count值依次加一的结果。
以上简单的介绍了在ASP.NET Web Services 中使用Session的做法以及客户端程序该注意的地方,希望对大家有所帮助。