Принимать Cookies в WebClient? - программирование
Подтвердить что ты не робот

Принимать Cookies в WebClient?

Я только начал экспериментировать с С# WebClient. У меня есть код ниже, который получает html-код с веб-сайта и записывает его в .txt файл. Единственная проблема, с которой я сталкиваюсь, заключается в том, что на некоторых веб-сайтах вам необходимо принять файлы cookie, прежде чем вы сможете использовать веб-сайт. Это связано с тем, что вместо написания реального HTML-кода веб-сайта в файл .txt он записывает код cookie popt 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);
}

Итак, каково решение этого? Может ли кто-нибудь привести меня к правильному пути?

4b9b3361

Ответ 1

Использование:

        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. Эти методы можно переопределить для обработки контейнера файлов cookie.

Ответ 2

Просто сохраните строку cookie из заголовков в свой локальный сеанс. _cookies string

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;

        } 

Ответ 3

Это может быть двойной дубликат Как я могу заставить WebClient использовать Cookies?

Вопрос, на который я ссылался выше, для VB.NET, но механизм должен быть таким же для С#. Я подозреваю, что поведение, которое вы видите, это веб-сайт, который отправляет куки файл, а затем запрашивает его, но ваш клиент не настроен на возврат cookie на сервер, поэтому он интерпретирует это, поскольку вы не принимаете файлы cookie. '

Используете ли вы инструмент анализа, например Fiddler, для анализа того, что сообщается/от вашего клиента?

Вам также может потребоваться отправить определенный HTTP-заголовок, чтобы указать, что вы принимаете файлы cookie, но я не помню, что это было необходимо в моем прошлом опыте.