首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET WebService 呼叫時維持 Session:CookieContainer 解決方案

     編輯:ASP.NET 基礎

問題情境

透過 Web Reference (舊式 ASMX 代理) 呼叫 WebService 時:

  1. 第一次呼叫 Method1(),伺服器回應 Set-Cookie: ASP.NET_SessionId=xxx,建立 Session。
  2. 後續呼叫 Method2(),因未攜帶 SessionId,伺服器視為新 Session,導致邏輯失敗(如驗證失效、資料為空)。
  3. 瀏覽器直接測試卻正常,因瀏覽器自動管理 Cookie。

根因分析

Web Reference 產生的 Proxy 類別繼承自 SoapHttpClientProtocol,內建 CookieContainer 屬性,但預設為 null。若不手動指定同一個 CookieContainer 實例,每次呼叫都是獨立的 HTTP 連線,無法攜帶 Session Cookie。

解決方案:共用 CookieContainer

// 1. 建立 Proxy 實例
var proxy = new ConsoleApplication1.WebReference.YourWebServiceName();

// 2. 建立唯一的 CookieContainer,並在呼叫前指派給 Proxy
var cookies = new System.Net.CookieContainer();
proxy.CookieContainer = cookies;

// 3. 呼叫第一個方法(此時伺服器會 Set-Cookie,CookieContainer 自動儲存)
proxy.Method1();

// 4. 呼叫第二個方法(CookieContainer 自動帶入 ASP.NET_SessionId,伺服器識別同一 Session)
proxy.Method2(); // 正常運作

關鍵點總結

  • 同一個 CookieContainer 實例必須在所有 WebService 呼叫之間共用(可用 Singleton 或静態欄位持有)。
  • 此作法適用於無法修改 WebService 端代碼的情況(如第三方服務)。
  • 若為 WCF 或新式 HttpClient,處理方式不同(HttpClientHandler.CookieContainer)。

延伸閱讀

作者早期關於 HttpWebRequest/HttpWebResponse 手動處理 Cookie 的文章:HTTP 抓包與 Cookie 處理。本文方案更簡潔,直接利用 Proxy 內建屬性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved