web-dev-qa-db-fra.com

Comment ajouter des cookies à WebRequest?

J'essaie de tester un peu le code, et je dois remplacer ceci:

  HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create( uri );
  httpWebRequest.CookieContainer = new CookieContainer();

avec

  WebRequest webRequest = WebRequest.Create( uri );
  webRequest.CookieContainer = new CookieContainer(); 

Fondamentalement, comment puis-je obtenir des cookies dans la demande sans utiliser HttpWebRequest?

26
O.O

En fonction de vos commentaires, vous pourriez envisager d’écrire une méthode d’extension :

public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie)
{
    HttpWebRequest httpRequest = webRequest as HttpWebRequest;
    if (httpRequest == null)
    {
        return false;
    }

    if (httpRequest.CookieContainer == null)
    {
        httpRequest.CookieContainer = new CookieContainer();
    }

    httpRequest.CookieContainer.Add(cookie);
    return true;
}

Ensuite, vous pouvez avoir un code comme:

WebRequest webRequest = WebRequest.Create( uri );
webRequest.TryAddCookie(new Cookie("someName","someValue"));
29
dlev

WebRequest est une classe abstraite qui ne possède pas de propriété CookieContainer. De plus, vous ne pouvez pas utiliser la collection Headers (exception non implémentée), toute tentative telle que webRequest.Headers.Add ("Cookie", "...") échouera.

Désolé, mais vous n'avez aucune chance d'utiliser des cookies avec WebRequest.

Coller sur HttpWebRequest et ajouter/modifier autant de cookies que vous aimez en utilisant sa collection d'en-têtes!

6
user1088520

Essayez avec quelque chose comme ça:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html");
request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour"));
3
HatSoft

la réponse de dlev a fini par fonctionner, mais j'ai eu des problèmes pour implémenter la solution ("Le paramètre '{0}' ne peut pas être une chaîne vide."). J'ai donc décidé d'écrire le code complet au cas où quelqu'un d'autre aurait des problèmes similaires.

Mon objectif était d'obtenir le code HTML en tant que chaîne, mais je devais ajouter les cookies à la demande Web. C'est la fonction qui télécharge la chaîne en utilisant les cookies:

public static string DownloadString(string url, Encoding encoding, IDictionary<string, string> cookieNameValues)
{
    using (var webClient = new WebClient())
    {
        var uri = new Uri(url);
        var webRequest = WebRequest.Create(uri);
        foreach(var nameValue in cookieNameValues)
        {
            webRequest.TryAddCookie(new Cookie(nameValue.Key, nameValue.Value, "/", uri.Host));
        }                
        var response = webRequest.GetResponse();
        var receiveStream = response.GetResponseStream();
        var readStream = new StreamReader(receiveStream, encoding);
        var htmlCode = readStream.ReadToEnd();                
        return htmlCode;
    }
}   

Nous utilisons le code de la réponse de dlev: 

public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie)
{
    HttpWebRequest httpRequest = webRequest as HttpWebRequest;
    if (httpRequest == null)
    {
        return false;
    }

    if (httpRequest.CookieContainer == null)
    {
        httpRequest.CookieContainer = new CookieContainer();
    }

    httpRequest.CookieContainer.Add(cookie);
    return true;
}

Voici comment vous utilisez le code complet:

var cookieNameValues = new Dictionary<string, string>();
cookieNameValues.Add("varName", "varValue");
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues);
1
Xavier Peña