在Web Service中使用ASP.net狀態(tài)保持(4)_Windows教程
' 這里并沒有與Session打交道
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim proxy As New localhost.Service1()
Dim ret As Integer
ret = proxy.IncrementSessionCounter()
Label1.Text = "Result: " & CStr(ret)
End Sub
當(dāng)我第一次調(diào)用Web Service時,一切正常,Web方法返回1,這就是那個Session變量的應(yīng)有的初始值�,F(xiàn)在我點擊Button1來再次調(diào)用這個Web方法,我希望看到的返回值是2�?上У氖�,無論我點擊多少次Button1,返回值一直都是1。
你也許會懷疑原因就是我每次都創(chuàng)建了一個新的proxy類的實例去調(diào)用Web方法,因此每次我點擊按鈕,都會丟失上一次調(diào)用時的cookie。不幸的是,即使你將proxy類的初始化代碼移到窗體的構(gòu)造函數(shù)中,然后對每次Web方法調(diào)用使用同一個proxy類的實例,你還是不可能看到返回值有增加的跡象。
問題在于cookie。Web Service代碼并未從調(diào)用請求中發(fā)現(xiàn)有效的會話ID,因此它每次被調(diào)用都創(chuàng)建一個全新的HttpSessionState對象,并且返回它的初始值1。因為作為客戶端的proxy類是從類System.Web.Service.Protocols.SoapHttpClientProtocol繼承的,它不包含System.Net.CookieContainer類的實例,因此,沒有地方來存放返回的cookie。為了解決這個問題,我對代碼做了如下一些修改:
' 使用了ASP.NET的session
' 但是并不是無Cookie的session.
Private Cookies As System.Net.CookieContainer
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim proxy As New localhost.Service1()
Dim ret As Integer
' 為proxy類設(shè)置cookie容器
If Cookies Is Nothing Then
Cookies = New System.Net.CookieContainer()
End If
proxy.CookieContainer = Cookies
ret = proxy.IncrementSessionCounter()
Label1.Text = "Result: " & CStr(ret)
End Sub
現(xiàn)在代碼工作正常了!每點擊一次Button1,我都可以看到返回值增加1。注意到我并不是在函數(shù)中聲明變量Cookies的,它是窗體類的一個私有成員,因為如果希望每次都返回同一個會話ID給服務(wù)器的話,就必須在每次請求中使用CookieContainer類的同一個實例。這就解釋了為什么SoapHttpClientProtocol類默認(rèn)不自動地設(shè)置的cookie容器。正應(yīng)為此,你可以在多個SoapHttpClientProtocol類的實例中共享一個cookie容器,而不是為其每個實例自動地創(chuàng)建一個新的cookie容器。
無cookie的Session
從Web Service的開發(fā)者的角度來看,你可以想到相當(dāng)多的人在試圖使用你的Web服務(wù)時忘記在客戶端代理類中添加Cookie容器。聰明的開發(fā)者或許靈光一閃,就會發(fā)現(xiàn)無cookie的Session應(yīng)該可以出色地解決這個問題。如果將web.config文件中sessionState元素的cookieless參數(shù)設(shè)置為“true”,你將會發(fā)現(xiàn),通過瀏覽器界面調(diào)用Web方法時,session變量工作正常,但是如果你在Visual Studio.net中通過“添加Web引用”來調(diào)用它時,依然存在著一些問題。
- 相關(guān)鏈接:
- 教程說明:
Windows教程-在Web Service中使用ASP.net狀態(tài)保持(4)
。