web-dev-qa-db-ja.com

WebClientでCookieを受け入れますか?

C#WebClientの実験を開始しました。私が持っているのは、ウェブサイトからhtmlコードを取得し、それを.txtファイルに書き込む以下のコードです。私が抱えている唯一の問題は、一部のWebサイトでは、Webサイトを使用する前にCookieを受け入れる必要があることです。これにより、実際のWebサイトのHTMLコードが.txtファイルに書き込まれるのではなく、CookieポップアップHTMLコードが書き込まれます。

コード:

string downloadedString;
System.Net.WebClient client;

client = new System.Net.WebClient();

//"http://nl.wikipedia.org/wiki/Lijst_van_spelers_van_het_Nederlands_voetbalelftal"
downloadedString = client.DownloadString(textBox1.Text);

using (StreamWriter write = new StreamWriter("Data.txt"))
{
    write.Write(downloadedString);
}

これに対する解決策は何ですか?誰かが私を正しい道に導くことができますか?

16
MeesterPatat

使用法 :

        CookieContainer cookieJar = new CookieContainer();
        cookieJar.Add(new Cookie("my_cookie", "cookie_value", "/", "mysite"));

        CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);

        string response = client.DownloadString("http://example.com/response_with_cookie_only.php");

public class CookieAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; set; }
    public Uri Uri { get; set; }

    public CookieAwareWebClient()
        : this(new CookieContainer())
    {
    }

    public CookieAwareWebClient(CookieContainer cookies)
    {
        this.CookieContainer = cookies;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = this.CookieContainer;
        }
        HttpWebRequest httpRequest = (HttpWebRequest)request;
        httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        return httpRequest;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];

        //do something if needed to parse out the cookie.
        if (setCookieHeader != null)
        {
            Cookie cookie = new Cookie(); //create cookie
            this.CookieContainer.Add(cookie);
        }

        return response;
    }
}

GetWebRequestとGetWebResponseの2つのオーバーライドされたメソッドが表示されます。これらのメソッドをオーバーライドして、Cookieコンテナを処理できます。

27
Parimal Raj

ヘッダーのCookie文字列をローカルセッションの_cookies文字列に格納するだけです

if (System.Web.HttpContext.Current.Session["cookie"] != null)
            _cookies = System.Web.HttpContext.Current.Session["cookie"].ToString(); 

     using (WebClient wc =  new WebClient())
        {

            wc.Headers.Add("Cookie", _cookies);
             string HtmlResult = wc.UploadString(bridge_url, myParameters);
            _cookies = wc.ResponseHeaders["Set-Cookie"];
            Debug.WriteLine("Headers" + _cookies); 

            System.Web.HttpContext.Current.Session["cookie"] = _cookies;

        } 
4
DenisPashkov

これは WebClientにCookieを使用させるにはどうすればよいですか?

上記で参照した質問はVB.NETに関するものですが、C#の場合もメカニズムは同じです。あなたが見ている動作は、WebサイトがCookieを送信してからそれを要求しているようですが、クライアントはCookieをサーバーに返すように設定されていないため、「Cookieを受け入れない」と解釈します。

Fiddlerなどの分析ツールを使用して、クライアントとの間でやり取りされる内容を分析しましたか?

また、Cookieを受け入れることを示すために特定のHTTPヘッダーを送信する必要がある場合もありますが、これまでの経験で必要だったことは覚えていません。

2
maelstrom