J'ai déjà utilisé un CookieContainer avec des sessions HttpWebRequest et HttpWebResponse, mais maintenant, je veux l'utiliser avec un WebClient. Autant que je sache, il n'y a pas de méthode intégrée comme pour HttpWebRequests ( request.CookieContainer
). Comment puis-je collecter des cookies d'un WebClient dans un CookieContainer?
J'ai cherché cela sur Google et j'ai trouvé l'exemple suivant :
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;
}
}
Est-ce la meilleure façon de le faire?
c#
cookies
httpwebrequest
webclient
cookiecontainer
Maxim Zaslavsky
la source
la source
m_container
n'est jamais défini!? N'est-il pas toujours vide?Réponses:
Oui. À mon humble avis, remplacer GetWebRequest () est la meilleure solution pour les fonctionnalités limitées de WebClient. Avant de connaître cette option, j'ai écrit beaucoup de code vraiment pénible sur la couche HttpWebRequest parce que WebClient a presque, mais pas tout à fait, fait ce dont j'avais besoin. La dérivation est beaucoup plus facile.
Une autre option consiste à utiliser la classe WebClient standard, mais à remplir manuellement l'en-tête Cookie avant de faire la demande, puis à extraire l'en-tête Set-Cookies sur la réponse. Il existe des méthodes d'assistance sur la classe CookieContainer qui facilitent la création et l'analyse de ces en-têtes:
CookieContainer.SetCookies()
etCookieContainer.GetCookieHeader()
, respectivement.Je préfère la première approche car elle est plus facile pour l'appelant et nécessite moins de code répétitif que la deuxième option. En outre, l'approche de dérivation fonctionne de la même manière pour plusieurs scénarios d'extensibilité (par exemple les cookies, les proxies, etc.).
la source
À partir des commentaires
Comment formatez-vous le nom et la valeur du cookie à la place de "somecookie"?
Pour plusieurs cookies:
la source
Celui-ci n'est qu'une extension de l'article que vous avez trouvé.
la source
readonly
modificateur ducontainer
champ, sinon vous ne pouvez pas le définir dans la propriété. J'ai modifié le code.Set-Cookie
tête de la réponseReadCookies
?GetWebResponse
etReadCookies
, puisque les cookies seront ajoutés automatiquement au conteneur.Le HttpWebRequest modifie le CookieContainer qui lui est attribué. Il n'est pas nécessaire de traiter les cookies renvoyés. Attribuez simplement votre conteneur de cookies à chaque demande Web.
la source
Je pense qu'il existe un moyen plus simple de ne pas avoir à créer un nouveau client Web (et cela fonctionnera également avec des bibliothèques tierces)
Il ne vous reste plus qu'à choisir les domaines pour lesquels vous souhaitez utiliser ceci:
Cela signifie que TOUTE webrequest qui va à example.com utilisera désormais votre créateur de webrequest personnalisé, y compris le client Web standard. Cette approche signifie que vous n'avez pas à toucher tout votre code. Vous appelez simplement le préfixe de registre une fois et en avez terminé. Vous pouvez également vous inscrire au préfixe "http" pour tout opter partout.
la source