Использование CookieContainer с classом WebClient

Ранее я использовал CookieContainer с сеансами HttpWebRequest и HttpWebResponse, но теперь я хочу использовать его с WebClient. Насколько я понимаю, нет встроенного метода, например, для HttpWebRequests ( request.CookieContainer ). Как я могу собирать cookies из WebClient в CookieContainer?

Я искал это для поиска и нашел следующий пример :

 public class CookieAwareWebClient : WebClient { private readonly CookieContainer m_container = new CookieContainer(); protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); HttpWebRequest webRequest = request as HttpWebRequest; if (webRequest != null) { webRequest.CookieContainer = m_container; } return request; } } 

Это лучший способ сделать это?

5 Solutions collect form web for “Использование CookieContainer с classом WebClient”

Да. IMHO, переопределение GetWebRequest () – лучшее решение ограниченной функциональности WebClient. Прежде чем я узнал об этом варианте, я написал много очень мучительного кода на уровне HttpWebRequest, потому что WebClient почти, но не совсем, сделал то, что мне было нужно. Вывод намного проще.

Другой вариант – использовать обычный class WebClient, но вручную заполнять заголовок Cookie перед тем, как сделать запрос, а затем вытащить заголовок Set-Cookies в ответ. В classе CookieContainer есть вспомогательные методы, которые упрощают создание и анализ этих заголовков: CookieContainer.SetCookies() и CookieContainer.GetCookieHeader() , соответственно.

Я предпочитаю прежний подход, потому что это проще для вызывающего и требует менее повторяющегося кода, чем второй вариант. Кроме того, подход деривации работает одинаково для нескольких сценариев расширяемости (например, cookies, прокси и т. Д.).

  WebClient wb = new WebClient(); wb.Headers.Add(HttpRequestHeader.Cookie, "somecookie"); 

Из комментариев

Как вы форматируете имя и значение cookie вместо «somecookie»?

 wb.Headers.Add(HttpRequestHeader.Cookie, "cookiename=cookievalue"); 

Для нескольких файлов cookie:

 wb.Headers.Add(HttpRequestHeader.Cookie, "cookiename1=cookievalue1;" + "cookiename2=cookievalue2"); 

Это просто расширение статьи, которую вы нашли.

 public class WebClientEx : WebClient { public WebClientEx(CookieContainer container) { this.container = container; } public CookieContainer CookieContainer { get { return container; } set { container= value; } } private CookieContainer container = new CookieContainer(); protected override WebRequest GetWebRequest(Uri address) { WebRequest r = base.GetWebRequest(address); var request = r as HttpWebRequest; if (request != null) { request.CookieContainer = container; } return r; } protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) { WebResponse response = base.GetWebResponse(request, result); ReadCookies(response); return response; } protected override WebResponse GetWebResponse(WebRequest request) { WebResponse response = base.GetWebResponse(request); ReadCookies(response); return response; } private void ReadCookies(WebResponse r) { var response = r as HttpWebResponse; if (response != null) { CookieCollection cookies = response.Cookies; container.Add(cookies); } } } 

HttpWebRequest изменяет назначенный ему CookieContainer. Нет необходимости обрабатывать возвращенные cookies. Просто присвойте свой контейнер cookie каждому веб-запросу.

 public class CookieAwareWebClient : WebClient { public CookieContainer CookieContainer { get; set; } = new CookieContainer(); protected override WebRequest GetWebRequest(Uri uri) { WebRequest request = base.GetWebRequest(uri); if (request is HttpWebRequest) { (request as HttpWebRequest).CookieContainer = CookieContainer; } return request; } } 

Я думаю, что есть более чистый способ, когда вам не нужно создавать новый веб-клиент (и он будет работать и с сторонними библиотеками)

 internal static class MyWebRequestCreator { private static IWebRequestCreate myCreator; public static IWebRequestCreate MyHttp { get { if (myCreator == null) { myCreator = new MyHttpRequestCreator(); } return myCreator; } } private class MyHttpRequestCreator : IWebRequestCreate { public WebRequest Create(Uri uri) { var req = System.Net.WebRequest.CreateHttp(uri); req.CookieContainer = new CookieContainer(); return req; } } } 

Теперь все, что вам нужно сделать, это выбрать, для каких доменов вы хотите использовать это:

  WebRequest.RegisterPrefix("http://example.com/", MyWebRequestCreator.MyHttp); 

Это означает, что любой веб-запрос, который отправляется на example.com, теперь будет использовать вашего собственного создателя webrequest, включая стандартного веб-клиента. Этот подход означает, что вам не нужно касаться всего кода. Вы просто вызываете префикс регистра один раз и выполняете его. Вы также можете зарегистрироваться для префикса «http», чтобы выбрать все для повсеместного использования.

  • ASP.NET-controller: asynchronous модуль или обработчик завершен, пока асинхронная операция все еще находится на рассмотрении
  • Как я могу программным образом удалить 2 ограничения соединения в WebClient
  • Установите тайм-аут для webClient.DownloadFile ()
  • HTTP POST возвращает ошибку: 417 «Ожидание не выполнено».
  • Символы в строке изменились после загрузки HTML из Интернета
  • Автоматически распаковывать ответ gzip через WebClient.DownloadData
  • Аутентификация и запрос временной шкалы пользователя с помощью API Twitter 1.1 oAuth
  • Загрузите и загрузите двоичный файл на / из FTP-сервера в C # /. NET
  • Распаковка gzip-ответа от WebClient
  • Как заполнить формы и отправить с помощью Webclient в C #
  • Как получить строку json из url?
  • Interesting Posts

    VirtualBox совместно использует папку

    Что касается локальной переменной, проходящей в streamе

    Как обойти отсутствие транзакций в MongoDB?

    Почему мы используем оператор «?» В привязке шаблона в угловом 2

    Библиотека Android Picasso, Как добавить заголовки аутентификации?

    Если FAT32 имеет ограничение на размер файла 4 ГБ, как мне удалось скопировать мой 13-битный файл библиотеки iPhoto на этот диск?

    HttpURLConnection Недействительный HTTP-метод: PATCH

    Как добавить пользовательскую вкладку Ribbon с помощью VBA?

    Почему GetType возвращает System.Int32 вместо Nullable ?

    Развертывание приложения ASP.NET MVC4 для компилятора GoDaddy

    Вентилятор центрального процессора Sony Vaio работает на полной скорости после установки предварительного просмотра Windows 8.1

    Как получить заголовок Excel на каждой странице печати в качестве первой строки таблицы

    Дублирование столбца таблицы с сохранением отдельной нумерации (в текстовом редакторе, например: MS Word, Libre Office Writer и т. Д.)

    Как читать хорошо сформированный XML в Java, но пропустить схему?

    Ноутбук перестает загружаться, если подключен приемник беспроводной мыши

    Давайте будем гением компьютера.