1

自動化されたWebリクエストを実行しようとしていますが、Cookieを次から次へと維持する必要があります。最初の応答から必要なCookieが返されていることがわかりますが、次のリクエストに添付できません。

c#コード

// response part

using (var wresp = (System.Net.HttpWebResponse)wrequest.GetResponse())
{

    // respblob gets returned and is accessible to the next request
    respblob.CookieList = new List<System.Net.Cookie>(); 

    foreach (System.Net.Cookie cook in wresp.Cookies)
    {
        respblob.CookieList.Add(cook);
    }

    // ... more stuff not related to cookies
}


// next request part
   var wrequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);

    wrequest.Method = "POST";
    wrequest.ContentType = "application/x-www-form-urlencoded";

    wrequest.CookieContainer = new System.Net.CookieContainer();

    // request.CookieList contains one cookie as expected 
    // from the previous response
    for (int j = 0; j < request.CookieList.Count; j++)
    {
        wrequest.CookieContainer.Add(request.CookieList[j]);
    }


// .... write data to request body

// ... complete the request, etc

これは、2つの要求/応答アクションの記録された交換です。

リクエスト:

GET http://domain.com/Login.aspx?ReturnUrl=%2fDefault.aspx HTTP/1.1
Host: domain.com
Connection: Keep-Alive

応答:

HTTP/1.1 200 OK
Date: Tue, 15 May 2012 17:17:52 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=zzz4fpb4alwi1du2yavx5tah; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 24408



...html content...

次のリクエスト:

POST http://domain.com/Login.aspx?ReturnUrl=%2fDefault.aspx HTTP/1.1
Host: domain.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 979
Expect: 100-continue

__LASTFOCUS=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=viewstateclipped&__EVENTVALIDATION=validationclipped&ctl00%2524ContentPlaceHolder1%2524Login1%2524LoginButton=&ctl00%2524ContentPlaceHolder1%2524Login1%2524UserName=my.email%40example.com&ctl00%2524ContentPlaceHolder1%2524Login1%2524Password=myPassword

そのため、CookieがHttpWebRequest CookieContainerに存在していても、リクエストとともに送信されません。私は何が間違っているのですか?

4

1 に答える 1

13

使用している両方のオブジェクトに同じCookieContainerインスタンスを使用する必要があります。HttpWebRequestCookieContainerインスタンスを1回作成するだけです。

var cookieContainer = new CookieContainer();

次に、両方のリクエストオブジェクトにこのインスタンスを使用させます。

var request1 = (HttpWebRequest)WebRequest.Create("http://example.com/url1");
// assign the cookie container for the first request
request1.CookieContainer = cookieContainer;
... go ahead and send the request and process the response


var request2 = (HttpWebRequest)WebRequest.Create("http://example.com/url2");
// reuse the same cookie container instance as the first request
request2.CookieContainer = cookieContainer;
... go ahead and send the request and process the response

両方のリクエストに同じCookieContainerを使用しているため、最初のリクエストがCookieをこのコンテナに保存すると、Cookieは2番目のリクエストと一緒に自動的に発行されます。もちろん、これは2番目のリクエストが最初のリクエストと同じドメインに対するものであることを前提としています。

また、CookieはセッションCookie(HttpOnlyフラグ)であるため、クライアントからその値を読み取ることはできません。

于 2012-05-15T17:37:19.713 に答える