2009-07-13 7 views
27

Tengo una API basada en HTTP a la que posiblemente necesite llamar muchas veces. El problema es que no puedo obtener la solicitud para tomar menos de unos 20 segundos, aunque la misma solicitud realizada a través de un navegador es casi instantánea. El siguiente código ilustra cómo lo he implementado hasta ahora.Cómo realizar una solicitud web rápida en C#

WebRequest r = HttpWebRequest.Create("https://example.com/http/command?param=blabla"); 
var response = r.GetResponse(); 

Una solución sería hacer una solicitud asincrónica, pero me gustaría saber por qué se tarda tanto tiempo y si puedo evitarlo. También intenté usar la clase WebClient, pero sospecho que usa una WebRequest internamente.

Actualización:

Ejecutar el siguiente código tomó unos 40 segundos en modo de lanzamiento (medido con el cronómetro):

WebRequest g = HttpWebRequest.Create("http://www.google.com"); 
var response = g.GetResponse(); 

Estoy trabajando en una universidad donde puede haber cosas diferentes en la configuración de la red afecta el rendimiento, pero el uso directo del navegador ilustra que debe ser casi instantáneo.

Actualización 2:

he subido el código para una máquina remota y funcionó bien por lo que la conclusión debe ser que el código .NET hace algo extra en comparación con el navegador o que tiene la resolución de problemas a través de la dirección de la red de la universidad (¿problemas de proxy o algo ?!).

+6

¿Cómo determinó que la solicitud web lleva tiempo? Por lo general, no tengo problemas de rendimiento con la clase HttpWebRequest. ¿Ha intentado que la aplicación realizara varias llamadas y, de ser así, todas las llamadas tomaron tanto tiempo? –

+1

¿Sucede con todas las URL, como google.com? ¿Qué pasa con el uso de una URL no ssl? – tbreffni

+0

Sí, los comentarios y sugerencias de Fredrik son buenos. No hay ninguna razón por la que HttpWebRequest deba tener un rendimiento deficiente de ninguna manera (y mucho menos * que * deficiente); después de todo, está usando el mismo protocolo que el navegador. – Noldorin

Respuesta

3

¿Su sitio tiene un certificado SSL no válido? Trate de añadir este

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AlwaysAccept); 

//... somewhere AlwaysAccept is defined as: 

using System.Security.Cryptography.X509Certificates; 
using System.Net.Security; 

public bool AlwaysAccept(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 
27

Este problema es similar a otro puesto en StackOverflow: Stackoverflow-2519655(HttpWebrequest is extremely slow)

La mayoría de las veces el problema es la propiedad del servidor proxy. Debe establecer esta propiedad como nula; de lo contrario, el objeto intentará buscar un servidor proxy apropiado para usar antes de ir directamente a la fuente. Nota: esta propiedad se enciende por defecto, por lo que debe indicar explícitamente al objeto que no realice esta búsqueda por proxy.

request.Proxy = null; 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
} 
+1

upvoting, parece que también es cierto para el HttpClient –

13

que estaba teniendo la demora de 30 segundos en la 'primera' intento - Referencia de JamesR al otro borne mencionar configuración del proxy en Null solucionado al instante!

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_site.url); 
request.Proxy = null; // <-- this is the good stuff 

... 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
1

No cierra su solicitud. Tan pronto como llegue a la cantidad de conexiones permitidas, tendrá que esperar a que se desconecten las anteriores. Pruebe

using (var response = g.GetResponse()) 
{ 
    // do stuff with your response 
} 
Cuestiones relacionadas