visual unit test studio net make how español ejemplo c# .net unit-testing

c# - unit - ¿Cómo agregar cookies a WebRequest?



unit test c# visual studio 2017 (4)

Intenta con algo como esto:

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

Estoy intentando probar un poco el código y necesito reemplazar esto:

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

con

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

Básicamente, ¿cómo puedo obtener cookies en la solicitud sin utilizar un HttpWebRequest?


La respuesta de dlev terminó funcionando, pero tuve problemas para implementar la solución ("El parámetro ''{0}'' no puede ser una cadena vacía"), así que decidí escribir el código completo en caso de que alguien más tenga problemas similares.

Mi objetivo era obtener el html como una cadena, pero necesitaba agregar las cookies a la solicitud web. Esta es la función que descarga la cadena usando las 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; } }

Estamos usando el código de la respuesta 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; }

Así es como usas el código completo:

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


Según sus comentarios, podría considerar escribir un método de extensión :

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; }

Entonces puedes tener un código como:

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


WebRequest es una clase abstracta que no tiene una propiedad CookieContainer. Además, no puede usar la colección de encabezados (no se ha implementado la excepción), por lo que cualquier intento como webRequest.Headers.Add ("Cookie", "...") fallará.

Lo sentimos, pero no tienes oportunidad de usar cookies con WebRequest.

¡Pégate a HttpWebRequest y agrega / edita tantas cookies como quieras con su colección de encabezados!