5

HttpWebRequestを介して2つの呼び出しを行う本番アプリがあります。最初の呼び出しはセッションを設定し、セッションを維持するためにCookieを受信します。2番目の呼び出しは、APIからのデータに対するものです。応答はhttponlyです。2つの呼び出し間で共有CookieContainerを使用していますが、2番目の呼び出しは常に失敗します。問題を2番目のリクエストで送信されないCookieに絞り込みました。ネットワークモニターを使用してトラフィックを監視しましたが、2番目のリクエストでCookieを明示的に設定すると(以下のコードを参照)、呼び出しは成功します。誰かがこの問題について何かアイデアがありますか?共有CookieContainerで動作させる方法を理解する必要があります。

private string URL_01 = "https:// [...]";
private string URL_02 = "https:// [...]";
private CookieContainer _cookieContainer = new CookieContainer();
private NetworkCredential nc = new NetworkCredential("username", "password");

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
HttpWebRequest request = HttpWebRequest.CreateHttp(URL_01);
request.CookieContainer = _cookieContainer;
request.Credentials = nc;
request.UseDefaultCredentials = false;
request.BeginGetResponse(new AsyncCallback(HandleResponse), request);
}

public void HandleResponse(IAsyncResult result)
{
HttpWebRequest request = result.AsyncState as HttpWebRequest;

if (request != null)
{
    using (WebResponse response = request.EndGetResponse(result))
    {
         using (StreamReader reader = new StreamReader(response.GetResponseStream()))
         {
             string data = reader.ReadToEnd();

             // gets returned data and deserializes it to an object
             SessionObject so = JsonConvert.DeserializeObject<SessionObject>(data);

             if (so.DeviceAPI.Session == "true")
             {
                // make a second call for the data
                HttpWebRequest requestData = HttpWebRequest.CreateHttp(URL_02);

                // when this is used, the call fails
                requestData.CookieContainer = _cookieContainer;

                // when this is used, the call works
                //requestData.Headers[HttpRequestHeader.Cookie] = "_key=value; _secret=value";

                requestData.Credentials = nc; 
                requestData.BeginGetResponse(new AsyncCallback(DataResponse), requestSongData);
                    }
                }
            }
        }
    }

    public void DataResponse(IAsyncResult DataResult)
    {
        HttpWebRequest requestData = DataResult.AsyncState as HttpWebRequest;

        if (requestData != null)
        {

            using (WebResponse dataResponse = requestData.EndGetResponse(DataResult))
            {
                using (StreamReader reader = new StreamReader(dataResponse.GetResponseStream()))
                {
                    string data = reader.ReadToEnd();
                    // do something with the data
                }
            }
        }
    }
}

}

4

2 に答える 2

3

この問題は、ドメイン名に「www」が含まれていない場合のCookieContainerの既知の問題です。CookieContainerは「www」を予期しており、ドメインの既存のCookieを識別しません。

回避策は、応答ヘッダーからCookieを読み取り、他の要求に追加することでした。

Mangoの修正が検討されましたが、押し出されました。

ジェフ

于 2011-10-04T22:22:56.437 に答える
0

私は彼の問題を抱えていましたが、それは古いクッキーコンテナの使用にあるようです. 古いものを反復処理して新しい Cookie を作成するだけで、新しい Cookie を作成できます。

ステップ 1. Cookie を保管するためのディクショナリーを作成します。

//create a dictionary to store your persistent cookies
public static Dictionary<string, Cookie> CookieCollection { get; set; }

ステップ 2. Web リクエストが送信される前に、保存した Cookie を Web リクエストに追加します。

var request = WebRequest.Create(...);

//add the cookies you have in your persistent cookie jar

foreach (KeyValuePair<string, Cookie> cookie in _collection)
            {
                try
                {
                    request.CookieContainer.Add(request.RequestUri, new Cookie(cookie.Value.Name, cookie.Value.Value));
                }
                catch
                {
                }
            }

ステップ 3. Cookie の保存

ResponseCallback(...) {

//update your local cookie list as required
   foreach (Cookie clientcookie in response.Cookies)
            {
                if (!_collection.ContainsKey(clientcookie.Name))
                    _collection.Add(clientcookie.Name, clientcookie);
                else
                    _collection[clientcookie.Name] = clientcookie;
            }
}
于 2011-09-29T15:59:56.077 に答える