Ранее я использовал CookieContainer с сеансами HttpWebRequest и HttpWebResponse, но теперь я хочу использовать его с WebClient. Насколько я понимаю, нет встроенного метода, как для HttpWebRequests ( request.CookieContainer
). Как я могу собирать куки с веб-клиента в 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;
}
}
Это лучший способ сделать это?
c#
cookies
httpwebrequest
webclient
cookiecontainer
Максим Заславский
источник
источник
m_container
никогда не устанавливается !? Разве это не всегда пусто?Ответы:
Да. ИМХО, переопределение GetWebRequest () является лучшим решением для ограниченной функциональности WebClient. Прежде чем я узнал об этой опции, я написал много действительно болезненного кода на уровне HttpWebRequest, потому что WebClient почти, но не совсем, сделал то, что мне было нужно. Вывод намного проще.
Другой вариант - использовать обычный класс WebClient, но вручную заполнить заголовок Cookie перед выполнением запроса, а затем извлечь ответный заголовок Set-Cookies. В классе CookieContainer есть вспомогательные методы, которые облегчают создание и анализ этих заголовков:
CookieContainer.SetCookies()
иCookieContainer.GetCookieHeader()
, соответственно.Я предпочитаю первый подход, так как он проще для вызывающего и требует меньше повторяющегося кода, чем второй вариант. Кроме того, подход деривации работает одинаково для нескольких сценариев расширяемости (например, куки, прокси и т. Д.).
источник
Из комментариев
Как вы форматируете имя и значение cookie вместо «somecookie»?
Для нескольких файлов cookie:
источник
Это просто продолжение статьи, которую вы нашли.
источник
readonly
модификаторcontainer
поля, иначе вы не сможете установить его в свойстве. Я изменил код.Set-Cookie
заголовок ответа вReadCookies
?GetWebResponse
иReadCookies
, так как куки будут добавлены в контейнер автоматически.HttpWebRequest изменяет назначенный ему CookieContainer. Нет необходимости обрабатывать возвращенные куки. Просто назначьте свой контейнер cookie для каждого веб-запроса.
источник
Я думаю, что есть более чистый способ, при котором вам не нужно создавать новый веб-клиент (и он будет работать со сторонними библиотеками)
Теперь все, что вам нужно сделать, это выбрать, для каких доменов вы хотите использовать это:
Это означает, что ЛЮБОЙ веб-запрос, который идет на example.com, теперь будет использовать ваш собственный создатель веб-запроса, включая стандартный веб-клиент. Такой подход означает, что вам не нужно трогать весь код. Вы просто вызываете префикс регистра один раз и покончите с этим. Вы также можете зарегистрироваться для префикса "http", чтобы подписаться на все везде.
источник