2010-03-17 199 views
18

He estado trabajando en el desarrollo de una especie de aplicación intermedia, que carga texto a un back-end CMS usando solicitudes HTTP para una serie de fechas (generalmente 7 a la vez) Estoy usando HttpWebRequest para lograr esto. Parece que funciona bien para la primera fecha, pero cuando comienza la segunda fecha, recibo System.Net.WebException: la solicitud se anuló: la solicitud se canceló.HttpWebRequest: la solicitud fue cancelada: la solicitud fue cancelada

He buscado alrededor y encontró los siguientes grandes pistas:

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/0d0afe40-c62a-4089-9d8b-fb4d206434dc

http://www.jaxidian.org/update/2007/05/05/8

http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html

y no han sido demasiado útil. Intenté sobrecargar GetWebReuqest, pero eso no tiene sentido porque no uso esa función.

Aquí está mi código: http://pastebin.org/115268

me sale el error en la línea 245 después de que se ha ejecutado correctamente al menos una vez.

Agradecería cualquier ayuda que pueda obtener ya que este es el último paso en un proyecto en el que he estado trabajando por algún tiempo. Este es mi primer proyecto C#/VS, así que estoy abierto a cualquier consejo, pero me gustaría centrarme en resolver este problema primero.

¡Gracias!

+0

El enlace de Pastebin está roto. –

Respuesta

15

La solución común que aparece en Internet parece ser establecer la propiedad KeepAlive de HttpWebRequest en false. Esto puede resolver el problema si la causa raíz es que se espera que la conexión se reutilice aunque se haya cerrado automáticamente después de un período de tiempo. Sin embargo, hay un golpe de rendimiento para abrir y cerrar constantemente las conexiones.

Otra posible solución que utilicé cuando encontré este problema fue ampliar las propiedades de tiempo de espera: WebRequest.ReadWriteTimeout, WebRequest.Timeout, RequestStream.WriteTimeout y RequestStream.ReadTimeout. Tenga en cuenta que están en milisegundos, por lo que puede desear que los tiempos de espera sean de 1000 * 60 * 10 para representar 10 minutos (o solo 600000 si cree que sabrá lo que eso significa ...). Puede probar si esta es la causa más probable del problema al reducir el tamaño del archivo.

BTW. Tu código ya no estaba en el sitio web mencionado. Es posible que desee incluirlo en el texto de su publicación si todavía es un problema.

3

Un breve resumen de mi aplicación: Tengo hasta 16 hilos idénticos haciendo solicitudes HTTP simultáneas. Cada uno de estos subprocesos se solicita desde diferentes servidores web junto con puntos finales locales únicos. Ahora la función que realiza estas llamadas tiene 3 solicitudes HTTP sucesivas para realizar (en el mismo servidor web) y realizar alguna agregación.

Basado en las soluciones publicadas en los enlaces de arriba, la siguiente combinación funcionó para mí.

System.Net.ServicePointManager.DefaultConnectionLimit = 200; 
System.Net.ServicePointManager.MaxServicePointIdleTime = 2000; 
System.Net.ServicePointManager.MaxServicePoints = 1000; 
System.Net.ServicePointManager.SetTcpKeepAlive(false, 0, 0); 

HttpWebRequest webRequest1 = (HttpWebRequest)WebRequest.Create("http://" + gatewayIP 
+ "/xslt?"); 
webRequest1.KeepAlive = false; 
webRequest1.Timeout = 2000; 
//Do other stuff here... 
//Close response stream 

Thread.Sleep(1000); //This delay seems to help. Obviously very specific to the server 

HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create("http://" + gatewayIP 
+ "/xslt?"); 
webRequest2.KeepAlive = false; 
webRequest2.Timeout = 2000; 
//Do other stuff here... 
//and so on... 
+1

Nunca debe necesitar la suspensión entre las llamadas. Si el tiempo de espera en las solicitudes no es lo suficientemente grande (2000 en milisegundos es solo 2 segundos), debe aumentar su tamaño, dentro de lo razonable. Y preste atención al impacto en el rendimiento que puede obtener con KeepAlive = false que otros han mencionado si está realizando una gran cantidad de llamadas HTTP. – MonkeyWrench

12

Aquí es la única solución que funciona para mí:

http://blogs.msdn.com/b/johan/archive/2006/11/15/are-you-getting-outofmemoryexceptions-when-uploading-large-files.aspx

Estas líneas son la clave:

HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(yourUri); 
    wr.KeepAlive = false; 
    wr.Timeout = System.Threading.Timeout.Infinite; 
    wr.ProtocolVersion = HttpVersion.Version10; 

Y aquí:

wr.AllowWriteStreamBuffering = false; 
+9

'Infinite' es bastante largo. :) – dotNET

Cuestiones relacionadas