在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)
。