私の考えが間違っていたら、私を訂正してください。
私が理解しているように、WebClient クラスの新しいインスタンスは新しいセッションを開始し、新しいセッション ID を生成します。
これを防ぐには、最初の使用からセッション ID を受け取り、それを WebClient のすべての新しいインスタンスに渡す必要があります。(「GET」メソッドの場合、他のパラメーターとしてリクエストに追加できます)
理論的には、次のようにクラスを使用して実行できます。
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 では機能しません。このアプローチには 2 つの問題があります。
- 保存された CookieContainer に jsessionid の値が表示されません。
- 以下のような別のアプローチを使用してこの値を受け取り、この値をリクエストURIに&jsessionid=someValueとして追加しても、それは役に立ちません。
何度か確認しましたが、Windows Phone でそのような要求を送信するたびに、応答には異なる固有の jsessionid が含まれています。
しかし、そのようなリクエストをブラウザで書くと、レスポンスは正しい jsessionid で返されます。
次のコードでは、Windows Phone の応答から jsessionid 値を受け取ることができますが (WebClient の代わりに HttpWebRequest を使用)、問題は解決しません。
// 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);