2011-01-06 38 views
10

Estamos usando WebClient, .NET 3.5sp1 en una aplicación de winforms. Para algunos usuarios esto se traduce en una excepción con el mensaje:Reproducir "El servidor cerró una conexión que se esperaba que se mantuviera activa".

"la conexión subyacente se cerró: Una conexión que se espera que sea mantenido con vida fue cerrada por el servidor."

Buscando un poco alrededor de la web sugiere una "solución" a simplemente desactivar HTTP keepalive, que no estamos realmente interesados ​​en hacer, algo sugiere que podría ser un error en las bibliotecas .NET, etc.

El mensaje de error sugiere que se trata de una conexión http controlada que de alguna manera se cerró por el servidor (o un proxy) sin que los subyacentes de WebClient lo detecten correctamente.

Estamos pensando en captar este caso específico, y simplemente intentemos con la solicitud nuevamente. Sin embargo, no podemos reproducir esta excepción. Asi que.

  1. ¿Cómo podemos capturar adecuadamente la caja que produce el mensaje de error anterior?

    captura (WebException ex) { si (== ex.Message "la conexión subyacente se cerró: Una conexión que se espera que sea mantenido con vida fue cerrada por el servidor") {...}

    huele mal.

  2. ¿Algún consejo sobre cómo podemos reproducir la excepción anterior?

+0

'' de los usuarios Para algunos sugiere que no todo el mundo. ¿Están esos usuarios detrás de un proxy (explícitamente establecido o un proxy transparente)? Los servidores proxy ocupados en entornos corporativos pueden soltar conexiones inesperadamente, de ahí la excepción. De cualquier manera, es un problema de red (cliente, host o bits intermedios) de algún tipo, no es un error en .NET Framework. –

+2

Probablemente tengas razón de que es un problema de red. Por lo tanto, queremos intentar simplemente volver a intentar la solicitud si esto es particular, aunque todo lo que sabemos es que este texto se originó a partir de una WebException, entonces ¿hay alguna manera confiable de detectar esta excepción específica, algún código de error específico o no? Y queremos reproducirlo, por lo que podemos probar que reintentar la solicitud no causa otra anomalía cuando "se cerró la conexión" – Habalusa

+0

Recibo el mismo error cuando intento enviar datos de gran tamaño desde la capa de servicio. ¿Alguna pista de por qué esto podría estar pasando? –

Respuesta

2

WebClient detecta esto muy bien. Por lo tanto, la excepción. Debes encontrar el servidor que se está portando mal. No estoy seguro de qué hacer si encuentra ese servidor, tal vez puede enviarle al administrador un mensaje de correo electrónico agradable.

Registre la URL del servidor.

+0

Bueno, esto podría ser cualquier cosa, desde una pasarela nativa sobrecargada que cierra la conexión prematuramente, hasta un servidor proxy en medio de la actuación, ninguno de los cuales alguna vez descubrirá y mucho menos arreglará. Mientras tanto, son los usuarios los que sufren. Aquí también hay una condición de carrera obvia, p. ¿Qué sucede si el servidor envía correctamente un Cierre de conexión: mientras el cliente intenta enviar una nueva solicitud en la conexión en caché, pero aún no se ha recibido la conexión cerrada? Por lo tanto, la pregunta: ¿alguna forma clara de reproducir esta excepción, y cómo verificamos esta barra de casos particular comparando e.Message? – Habalusa

+1

Personalizar el manejo de excepciones solo es útil si puede hacer algo en su código para solucionar el problema.No puedes arreglar un enrutador sobrecargado o un servidor molesto. Y el sistema operativo no puede notar la diferencia. Esto pertenece a una categoría grande de WebExceptions, solo puedes volver a intentarlo más tarde. Por eso no hay una clase de excepción dedicada para esta falla. Similar a IOException ("mierda sucedió") vs FileNotFoundException ("basura común, podría ser capaz de arreglar eso"). –

1

le sugiero que eche un vistazo a this blog Misrosoft: HTTP de cliente Protocolo Problemas

Cuestiones relacionadas