asp.net|web
簡介
網路程式開發人員們遇到的最普遍的問題就是如何在無狀態的基於HTTP協議的互動中保持狀態資訊。有許多聰明的辦法可以解決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協議的方法。
很容易在ASP.net中使用Session來保持狀態資訊,HttpSessionState類為你封裝了儲存Session狀態的細節問題。絕大多數的用戶端已經能夠明白他們必須返回伺服器設定的cookie,而且HttpSessionState類也支援在SOAP通訊中常用的底層傳輸。因此,很明顯,使用ASP.net的Session機制會是滿足狀態控制要求的明智的選擇。
使伺服器支援Session
在ASP.net中,對Web方法的狀態支援預設是關閉的,你必須為每個要使用Session狀態的Web方法顯式地啟用Session支援。啟用Session支援的方法是添加一個EnableSession選項到你的函數的WebMethod屬性中,並且將其值設定為true。下面的代碼示範了如何啟用Session並且在方法中訪問Session狀態資訊。
[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狀態。該參數預設設定為“InProc”,這時HttpSessionState對象將簡單地儲存在ASP.net進程的記憶體區。如果被設定為“Off”,那麼ASP.net程式的Session支援就被關閉了。
[1] [2] [3] 下一頁