透過 Web Reference (舊式 ASMX 代理) 呼叫 WebService 時:
Method1(),伺服器回應 Set-Cookie: ASP.NET_SessionId=xxx,建立 Session。Method2(),因未攜帶 SessionId,伺服器視為新 Session,導致邏輯失敗(如驗證失效、資料為空)。Web Reference 產生的 Proxy 類別繼承自 SoapHttpClientProtocol,內建 CookieContainer 屬性,但預設為 null。若不手動指定同一個 CookieContainer 實例,每次呼叫都是獨立的 HTTP 連線,無法攜帶 Session Cookie。
// 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(); // 正常運作
HttpClient,處理方式不同(HttpClientHandler.CookieContainer)。作者早期關於 HttpWebRequest/HttpWebResponse 手動處理 Cookie 的文章:HTTP 抓包與 Cookie 處理。本文方案更簡潔,直接利用 Proxy 內建屬性。