c# - studio - La primera llamada a un servicio web.net es lenta
web service asp net c# example (4)
Llamaré a un servicio web .net desde mi aplicación .Forms, ambos en el framework 4.0. Durante la ejecución del programa, la primera vez que se llama un método al servicio web, la llamada tarda ~ 10-12 segundos. Las llamadas posteriores tardan ~ 1-2 segundos. Las llamadas posteriores, incluso cuando se recrea la instancia de referencia web, son todavía ~ 1-2 segundos. Cuando se reinicia la aplicación de winforms, el primer retraso de llamada ocurre nuevamente, pero las llamadas subsiguientes responden.
La instancia de la referencia web se está creando antes de que se produzca la llamada, y no es parte de la demora.
Los XmlSerializers para la aplicación winforms se están generando (y se utilizan, por lo que yo sé, pero no estoy seguro de cómo verificar esto).
La demora no ocurre debido a una compilación de la primera ejecución en el lado del servicio web. Este es un servicio web de producción que se utiliza durante todo el día y su apppool permanece en la memoria. Por lo que puedo ver, la demora está ocurriendo ya sea en el lado del cliente, o entre el cliente y el servidor para esa primera llamada, pero no llamadas posteriores.
No estoy seguro de qué revisar a continuación. ¿Algunas ideas?
Como spender había indicado, el problema tenía que ver con la detección de proxy. Apagarlo en Internet Explorer resolvió el problema, pero no era factible hacerlo en mi situación.
En cambio, hay una solución alternativa para eludir el uso del proxy predeterminado y, por lo tanto, la detección automática.
Agregar estas entradas a la app.config permite que ciertas URL omitan el proxy:
<configuration>
<system.net>
<defaultProxy>
<bypasslist>
<add address="server/domain name" />
</bypasslist>
</defaultProxy>
</system.net>
</configuration>
Puede encontrar más información aquí: <defaultProxy Element> en MSDN
He sufrido este problema muchas veces. ¡Hombre, lo odio! jaja Mientras que nunca lo he resuelto de manera concluyente, puedes probar un par de cosas. En primer lugar, ¡realiza una llamada al servicio web durante el inicio y elimina primero el "dolor"! En segundo lugar, trate de jugar con el grupo de aplicaciones IIS del servicio web: haga que nunca se recicle solo o al menos lo haga a una hora antipática de la mañana o tal vez por cada 10000 solicitudes.
Sé que probablemente esta no sea una gran respuesta, ¡pero espero que ayude un poco!
EDITAR:
Parte del problema es que el servicio web no está ''siempre'' activo: se va a dormir, se recicla, etc. hasta que se necesita. ¡Valdría la pena leer sobre cómo mantener vivos los servicios web, el tiempo de espera de 5 9s, etc.!
He agregado estas configuraciones en mi basicHttpBinding , deshabilitando la detección automática de proxy y obteniendo una gran aceleración en el primer tiempo de ejecución. Por supuesto, esto funciona bien si te encuentras dentro del entorno de la intranet o si sabes que no necesitas ningún proxy.
bypassProxyOnLocal = "falso"
useDefaultWebProxy = "falso"
Espero que esto ayude.
intente configurar el proxy en un WebProxy vacío, es decir:
request.Proxy = new WebProxy();
o puede anular la configuración del proxy en el archivo .Config para su aplicación utilizando la clave defaultProxy en la sección system.net. Lo siguiente deshabilita la detección automática de Proxy:
<configuration >
<system.net>
<defaultProxy>
<proxy bypassonlocal="true" usesystemdefault="false" />
</defaultProxy>
</system.net>
</configuration>