Pregunta

Estoy creando un programa que se conecta a un sitio web y descarga XML desde él. Luego muestra la información al usuario.

El problema que tengo es cuando abro el programa por primera vez y empiezo a descargar la información XML que lleva mucho tiempo. Cuando cargo otra página del sitio con el programa aún abierto, la descarga tarda aproximadamente medio segundo. Me preguntaba si había alguna forma de evitar esto.

Actualmente utilizo una HttpWebRequest para descargar la transmisión y un StreamReader para leerla. Luego reviso y analizo el XML usando XLINQ.

¿Fue útil?

Solución

Intente configurar explícitamente el proxy. Si no tiene un proxy definido, la clase HttpRequest pasará tiempo buscando uno. Una vez que haya (o no haya encontrado) una, utilizará esa información durante la vida útil de la aplicación, acelerando las solicitudes posteriores.

//internally sets "ProxySet" to true, so won't search for a proxy
request.Proxy = null;

También puede definir esto en .config:

<system.net>
  <defaultProxy
    enabled="false"
    useDefaultCredentials="false" >
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>

Otros consejos

El primer retraso puede deberse a una combinación de lo siguiente:

  1. Hora de resolver la entrada DNS del servidor
  2. Hora de descargar el proxy autoconfig script, compilar y ejecutarlo para determinar el poder efectivo
  3. latencia de red desde su aplicación al servidor proxy (si hay un servidor proxy en su entorno)
  4. latencia de red de el servidor proxy a la actual servidor de destino.
  5. La latencia en el servidor para servir el XML documento. Si tiene que atravesar un representación de objetos en memoria y generar el documento XML, que Puede tomar algo de tiempo. Además, si es utilizando técnicas como Serialización XML para generar el documento, luego dependiendo de cómo se configura el serializador, el primero llame para serializar / deserializar siempre toma mucho tiempo, debido al hecho que necesita un ensamblaje intermedio para ser generado y compilado.
  6. Analizando el XML en el lado del cliente podría tomar tiempo, especialmente si el XML la estructura del documento es muy compleja.
  7. Si XLinq (como el XMLSerializer) genera ensamblaje temporal para el XML análisis y amp; consultas, luego el primero la solicitud llevará más tiempo que el los posteriores.

Para determinar qué parte está tomando tiempo, inserte un tiempo de registro en su código usando System.Diagnostics.Stopwatch ():

// this is the time to get the XML doc from the server, including the time to resolve DNS, get proxy etc.
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
timer.Start();
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
timer.Stop();
Console.WriteLine("XML download took: " + timer.ElapsedMilliseconds);

timer.Start();
// now, do your XLinq stuff here...
timer.Stop();
Console.WriteLine("XLinq took: " + timer.ElapsedMilliseconds);

Puede insertar un bucle alrededor de esto y ver cuál es la diferencia para los diversos componentes entre la primera solicitud y las solicitudes posteriores.

Si encuentra que la diferencia está en la descarga, y no en la consulta, puede investigar más a fondo olfateando la red con Wireshark .

Espero que esto ayude.

Probablemente tendría que investigar un poco más para averiguar qué parte de la solicitud está tardando más en el primer paso. Mi primer instinto dice que la solicitud de DNS para obtener la dirección IP del nombre de dominio que especifique tarda más, porque no se almacena en caché la primera vez que se ejecuta. También podría ser el servidor web en el otro extremo el que tiene que ejecutar algunos scripts de inicio la primera vez que lo consulta. Usted mencionó que la primera solicitud lleva mucho tiempo, pero no dice cuánto tiempo. ¿Esto está causando un gran problema que lleva mucho tiempo hacer la primera solicitud, o es solo una molestia?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top