1

私の考えが間違っていたら、私を訂正してください。

私が理解しているように、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 つの問題があります。

  1. 保存された CookieContainer に jsessionid の値が表示されません。
  2. 以下のような別のアプローチを使用してこの値を受け取り、この値をリクエスト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);
4

1 に答える 1