Eu já usei um CookieContainer com as sessões HttpWebRequest e HttpWebResponse, mas agora quero usá-lo com um WebClient. Tanto quanto eu entendo, não existe um método interno como o HttpWebRequests ( request.CookieContainer
). Como posso coletar cookies de um WebClient em um CookieContainer?
Eu pesquisei para isso e encontrei o seguinte exemplo :
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;
}
}
Esse é o melhor jeito de fazer isso?
c#
cookies
httpwebrequest
webclient
cookiecontainer
Maxim Zaslavsky
fonte
fonte
m_container
nunca está definido !? Não está sempre vazio?Respostas:
Sim. IMHO, substituindo GetWebRequest () é a melhor solução para a funcionalidade limitada do WebClient. Antes de conhecer essa opção, escrevi muitos códigos realmente dolorosos na camada HttpWebRequest porque o WebClient quase, mas não exatamente, fez o que precisava. Derivação é muito mais fácil.
Outra opção é usar a classe WebClient regular, mas preencha manualmente o cabeçalho Cookie antes de fazer a solicitação e, em seguida, retire o cabeçalho Set-Cookies na resposta. Existem métodos auxiliares na classe CookieContainer que facilitam a criação e a análise desses cabeçalhos:
CookieContainer.SetCookies()
eCookieContainer.GetCookieHeader()
, respectivamente.Prefiro a abordagem anterior, pois é mais fácil para o chamador e requer menos código repetitivo do que a segunda opção. Além disso, a abordagem de derivação funciona da mesma maneira para vários cenários de extensibilidade (por exemplo, cookies, proxies etc.).
fonte
De Comentários
Como você formata o nome e o valor do cookie no lugar de "somecookie"?
Para vários cookies:
fonte
Este é apenas uma extensão do artigo que você encontrou.
fonte
readonly
modificador docontainer
campo, caso contrário, não poderá defini-lo na propriedade Eu modifiquei o código.Set-Cookie
cabeçalho da respostaReadCookies
?GetWebResponse
eReadCookies
, pois os cookies serão adicionados ao contêiner automaticamente.O HttpWebRequest modifica o CookieContainer atribuído a ele. Não há necessidade de processar cookies retornados. Basta atribuir seu contêiner de cookies a cada solicitação da web.
fonte
Eu acho que há uma maneira mais limpa de você não precisar criar um novo cliente da Web (e funcionará também com bibliotecas de terceiros)
Agora tudo o que você precisa fazer é optar por quais domínios você deseja usar:
Isso significa que QUALQUER solicitação de web que vá para example.com agora usará seu criador de solicitação de web personalizado, incluindo o cliente da web padrão. Essa abordagem significa que você não precisa tocar em todo o código. Você acabou de chamar o prefixo do registro uma vez e pronto. Você também pode se registrar no prefixo "http" para ativar tudo em qualquer lugar.
fonte