example - webrequest post parameters c#
¿Qué hace que este WebRequest de HTTPS se agote a pesar de que funciona en el navegador? (6)
Aquí está mi pedido:
var request = (HttpWebRequest) WebRequest.Create("https://mtgox.com/");
request.CookieContainer = new CookieContainer();
request.AllowAutoRedirect = false;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
request.Headers[HttpRequestHeader.AcceptLanguage] = "en-gb,en;q=0.5";
request.Headers[HttpRequestHeader.AcceptCharset] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
request.Timeout = 5000;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
request.Method = "GET";
request.GetResponse();
Los encabezados fueron copiados de Firefox usando HttpFox. Utilicé Fiddler2 para verificar que, al menos para las solicitudes HTTP, los encabezados son completamente idénticos entre las solicitudes de Firefox y mis solicitudes.
Sin embargo, al realizar una solicitud a este sitio web específico mediante HTTPS, la solicitud simplemente agota el tiempo de espera. Funciona para otros sitios web.
Debo realizarlo de manera diferente a Firefox, porque siempre funciona en Firefox. No puedo depurarlo usando Fiddler2, sin embargo, porque cada vez que Fiddler2 reenvía estas solicitudes, también se agota el tiempo de espera , incluso cuando se originó por Firefox.
¿Es solo un sitio web con errores? ¿Qué parte de lo anterior me delata por no ser Firefox?
Lo más probable es que el cliente HTTPS no pueda validar la cadena de certificados presentada por este servidor, por ejemplo, debido a un certificado raíz faltante o al respondedor OCSP inaccesible. Es decir, puede haber algo diferente configurado en el navegador y en el cliente HTTPS que utiliza.
Como una de las opciones, puede tomar una versión de prueba de nuestros componentes HTTPBlackbox e intentar conectarse utilizando TElHTTPSClient. Le dará información detallada del error (en caso de error) para que pueda determinar qué sucede con HttpWebRequest.
Recientemente se enteró del mismo problema y quería ver si Microsoft podría haber solucionado esto en versiones .net más nuevas. Este es el código que probé con (dominio eliminado por privacidad):
HttpWebRequest request =
(HttpWebRequest)WebRequest.Create("https://www.xxSomeDomainNamexx.com/");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
Console.WriteLine(reader.ReadToEnd());
Compilado esto contra .net versiones 2.0, 3.0 y 3.5 y todos parecían exhibir exactamente el mismo comportamiento que todos aquí han estado discutiendo. Luego intenté compilar contra 4.0 y 4.5, y recibí las respuestas adecuadas en ambos lugares.
En base a esto, parece que Microsoft ha solucionado este problema en las versiones .net más recientes. Para la posteridad también probé el cambio SecurityProtocol sugerido por enverpex y funcionó muy bien en 2.0, 3.0 y 3.5.
La razón típica para los errores de tiempo de espera con llamadas HttpWebRequest / HttpWebReponse es "no cerrar el objeto / secuencia de respuesta", lo que mantiene activas las conexiones. Simplemente tiene que cerrar el objeto Stream
o el objeto HttpWebResponse
después de leer el contenido de la secuencia. El límite de conexión predeterminado es 2.
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Stream stream = webResponse.GetResponseStream();
string responseString = ((TextReader)new StreamReader(stream)).ReadToEnd();
webResponse.Close();
Alternativamente, si implementó su lógica en un servicio web que será invocado simultáneamente por muchos usuarios, entonces puede considerar aumentar el límite de conexión en el objeto HttpWebRequest.
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);
webRequest.ServicePoint.ConnectionLimit = 20;
Tuve el mismo problema de tiempo de espera con las solicitudes de https y ninguna de las respuestas me ayudó. Justo ahora encontré una solución que resolvió el problema para mí. Tenga en cuenta que esto solo funciona con .net framework 4.5 o superior.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var response = WebRequest.Create("https://yoursecurewebservice").GetResponse();
var body = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(body);
El .NET framework en Windows 7 implementa una extensión TLS: Nombre de servidor Indicación (RFC4366). De acuerdo con su publicación ¿Qué significa esta Alerta TLS significa que el servidor está respondiendo con "Nombre no reconocido". No estoy seguro de por qué se informa que la conexión ha expirado, porque realmente no es así. Los rastreos de su red deben mostrar que el cliente inicia una terminación de conexión después de esto [FIN, ACK]. La degradación a SSL3 evita la invocación del SNI.
FYI: el mismo .NET Framework en Windows XP no utiliza la extensión de indicación de nombre de servidor TLS. Tu programa funcionará allí ...
En mi caso rastreé la ocurrencia de esto a una directiva ServerName faltante en Apache. Agregar el ServerName a la configuración SSL lo resolvió, porque ahora el servidor web ya no está al tanto de su nombre.
Usando Microsoft Network Monitor, encontré que HttpWebRequest
se HttpWebRequest
en una etapa en la que se supone que debe enviar un intercambio de claves de cliente. Simplemente no lo hizo. El servidor lo esperó, pero nunca llegó.
Lo que solucionó fue forzar a HttpWebRequest a usar SSL3 en lugar de TLS (aunque se supone que TLS se convierta automáticamente en SSL3 si es necesario):
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Por qué es así, así que supongo que nunca lo sabré, solo una de esas cosas misteriosas que me tomaría más tiempo descubrir que ninguna otra persona que esté dispuesta a gastar ...
Una cosa que fue diferente acerca de las capturas: la variante TLS tenía una entrada "Alerta" en la respuesta Servidor Hola , que está ausente del intercambio SSL3 y también de todos los intercambios TLS que realmente funcionó. Curiosamente, sin embargo, la misma alerta está presente en una captura de Firefox que realiza la solicitud con éxito.
Finalmente, parece que hubo un error OCSP temporal justo cuando estaba publicando por primera vez esta pregunta, que desde entonces se ha resuelto. Esto se sumó al desastre, pero no es el problema principal.