糾正我,如果我錯了我的想法。無法使用WebClient接收Cookie
據我所知,WebClient類的任何新實例都將啓動一個新的會話,並生成新的會話ID。
爲了防止出現這種情況,我應該從第一次使用中收到一個會話ID,然後將它傳遞給WebClients的所有新實例。 (「獲取」方法只可以添加到任何其他參數的要求)
從理論上講,是可以做到的,使用類,像這樣:
public class ExtendedWebClient : WebClient
{
public CookieContainer CookieContainer { get; private set; }
[SecuritySafeCritical]
public ExtendedWebClient()
{
this.CookieContainer = new CookieContainer();
}
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
(request as HttpWebRequest).CookieContainer = this.CookieContainer;
return request;
}
}
但是不與工作jsessionid cookie,這種方法有兩個問題。
- 我看不到保存的CookieContainer中的jsessionid值。
- 即使我會用不同的方法,如下面的一個收到此值,然後這個值作爲& JSESSIONID添加到reqeust URI = someValue中,那也不會幫助。
我已經檢查了好幾次,並且任何時候我在Windows Phone中發送這樣的請求,響應都有不同且獨特的jsessionid。
但是,如果我在瀏覽器中寫入這樣的請求,則返回帶有正確的jsessionid的響應。
下面的代碼允許在Windows Phone的響應(都使用HttpWebRequest的,而不是Web客戶端)接收JSESSIONID值,但不解決問題:
// working with some uri
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.BeginGetResponse(asynchronousResult =>
{
try
{
using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
{
CookieCollection cookies = response.Cookies;
foreach (Cookie c in cookies)
{
if (c.Name == "JSESSIONID")
// jsessionid value is here. Can be saved & stored somewhere
}
response.Close();
}
catch (Exception e)
{
// handling exception somehow
}
}
, request);
您是否真的看到它在您使用POST時加載容器或者這是一個假設? –
更新後的問題,顯然不是GET方法的問題。找到了接收jsessionid值的方法,但仍無法強制應用程序在單個會話中工作。有什麼想法嗎? – Olter