簡介
網絡程序開發(fā)者們遇到的最普遍的問題就是如何在無狀態(tài)的基于http協(xié)議的交互中保持狀態(tài)信息。有許多聰明的辦法可以解決http協(xié)議的無狀態(tài)問題,例如對每個請求重復發(fā)送應用程序數據包、使用http認證機制來將請求映射到特定的用戶、使用cookie來存儲一系列請求的狀態(tài)等。在asp.net技術中提供了一個非常有效的方案來保持狀態(tài),該方案隱藏了所有高難度的,具有挑戰(zhàn)性的工作的細節(jié),用戶只需簡單地使用system.web.sessionstate.httpsessionstate類。同時,你也可以像在asp.net程序的web頁面(.aspx)中那樣在web service的方法中使用這個類,只有一點小小的不同。
asp.net的session對象概述
asp.net的session狀態(tài)信息是通過兩個機制保持。其一是使用cookie。當客戶端發(fā)送一個請求到服務器端時,服務器將發(fā)回一個附加http set-cookie頭的響應信息,而cookie的值就是以鍵/值對的形式保存在該信息里邊。在對同一服務器的所有的同步請求中,客戶端在http cookie頭中發(fā)送cookie鍵/值對。然后服務器可以將并發(fā)的請求同初始的請求對應起來。asp.net使用一個保存會話的id的cookie來保持會話狀態(tài)。該id標識被用來為特定的用戶找到與其對應的httpsessionstate類的實例。類httpsessionstate僅僅提供了一個通用的數據集,你可以在其中保存你需要的任何信息。
asp.net用來保持狀態(tài)的另外一種機制是無須使用cookie。一些瀏覽器被用戶設置為禁止使用cookie或者干脆就不支持cookie,asp.net提供了一種機制來解決這個問題,它的主要原理是將一個請求重定向到一個包含asp.net狀態(tài)id的url。當該請求被接受到時,這個嵌在url中的id被截取下來,服務器通過該id找到合適的httpsessionstate類的實例。這種方式在http協(xié)議的使用get方式的請求中工作的很好,但是在.net的xml web service代碼中會出現問題。
必須指出的是,有些時候把信息直接存儲在cookie中要比存儲在session中更好。避免使用session可以節(jié)省服務器資源,而且你也無須考慮一些煩人的問題,比如定位一個特定的session對象、session對象因為請求的長時間的延遲而被移除或者在服務器上沒必要地保留直到過期。然而,如果你有一些包含你不希望與你提供的服務的使用者共享的執(zhí)行信息,或者有一些你不希望通過未加密的信道傳輸的私有數據,或者你認為將這些數據插入http協(xié)議頭中是不切實際的,那么你就應該使用asp.net中的httpsessionstate,它將使你輕松解決這些問題。httpsessionstate類返回一個索引鍵,用以將一個特定的用戶映射到一個為該用戶保存信息的httpsessionstate類的實例。總之,無論是asp.net的httpsessionstate類還是http的cookie都可以在asp.net web service中使用。
為什么要在xml web service中使用基于http的機制來實現狀態(tài)保持呢?
在soap請求中有許多方法來保持狀態(tài)。一個切實可行的方法就是在soap頭中包含一些像asp中的會話id的信息,然而問題在于你不得不:1) 仍然要自己編寫服務器端代碼,并且 2) 確信你的客戶會像對待http cookie一樣對待你的包含會話id的soap頭并且將它附加到每個請求中回傳給你。當然有很多時候使用soap頭的方法會很方便,但是也有很多時候還不如使用基于http協(xié)議的方法。
很容易在asp.net中使用session來保持狀態(tài)信息,httpsessionstate類為你封裝了存儲session狀態(tài)的細節(jié)問題。絕大多數的客戶端已經能夠明白他們必須返回服務器設置的cookie,而且httpsessionstate類也支持在soap通信中常用的底層傳輸。因此,很明顯,使用asp.net的session機制會是滿足狀態(tài)控制要求的明智的選擇。
使服務器支持session
在asp.net中,對web方法的狀態(tài)支持默認是關閉的,你必須為每個要使用session狀態(tài)的web方法顯式地激活session支持。激活session支持的方法是添加一個enablesession選項到你的函數的webmethod屬性中,并且將其值設置為true。下面的代碼演示了如何激活session并且在方法中訪問session狀態(tài)信息。
[vb.net]
<webmethod(enablesession:=true)> _
public function incrementsessioncounterx() as integer
dim counter as integer
if context.session("counter") is nothing then
counter = 1
else
counter = context.session("counter") + 1
end if
context.session("counter") = counter
return counter
end function
如你所料,如果你為一個web方法激活了session支持,并不意味著其它的web方法的session支持也被激活。事實上,如果web方法的enablesession選項沒有被顯式地設置為true,那么context.session屬性的值將是null。
假設通過設置web.config文件禁止session,那么即使你在webmethod屬性中使用了enablesession選項,context.session的值也將一直是null。web.config文件中的/configuration/system.web/sessionstate項有一個mode參數,它決定了你的asp.net程序使用何種方法來保持session狀態(tài)。該參數默認設置為“inproc”,這時httpsessionstate對象將簡單地保存在asp.net進程的內存區(qū)。如果被設置為“off”,那么asp.net程序的session支持就被關閉了。
新聞熱點
疑難解答
圖片精選