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 galletas:
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 utilizando 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 se utiliza el código completo:
var cookieNameValues = new Dictionary<string, string>();
cookieNameValues.Add("varName", "varValue");
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues);
Eso sería difícil, ya que las cookies son un concepto HTTP. ¿Hay alguna razón por la que necesites hacer este cambio? – dlev
@dlev - WebRequest creará una HttpWebRequest basada en el uri. Por lo tanto, si quiero simular mi propio objeto WebRequest y/o registrar mi propio uri que también devuelve una WebRequest, no quiero restringir el método para que solo funcione con un objeto HttpWebRequest. –
Entiendo que el tipo de ejecución de 'webRequest' será' HttpWebRequest'. Pero el acceso a 'CookieContainer' requiere que el tipo de tiempo de compilación sea' HttpWebRequest'. Además, menciona no restringirse a HTTP, pero en ese caso, las cookies no significan mucho, ya que son una construcción HTTP (que es la razón de su ausencia en 'WebRequest' en primer lugar.) – dlev