net error err_incomplete_chunked_encoding c# google-chrome iis web-applications

c# - error - IIS y Chrome: no se pudo cargar el recurso: net:: ERR_INCOMPLETE_CHUNKED_ENCODING



error chunked encoding (5)

Recientemente encontré un problema de Chrome que creo que vale la pena compartirlo contigo.

Trabajé en una API auto escrita utilizando un HttpHandler cuyo principal debería devolver datos json. Pero cuando ocurre un error, quería mostrar un archivo html. Eso funcionó bastante bien en IE y FF, pero no en Chrome.

Mirar a las herramientas de desarrollo reveló este error: net :: ERR_INCOMPLETE_CHUNKED_ENCODING

Google dijo que no mucho sobre este tema, mientras que se vio mucho. Todo lo que pude saber fue que, después de algún tiempo, desapareció mágicamente.

Descubrí que se encuentra en estas líneas de código:

result.StoreResult(context); context.Response.Flush(); context.Response.Close(); //<-- this causes the error

Después de quitar la última línea funcionó bien. No sé por qué solo Chrome tuvo / tiene un problema con eso, pero parecía que cerré la secuencia de respuesta antes de que Chrome terminara de leerlo.

Espero que ayude a aquellos de ustedes que se encuentran con el mismo problema o similar.

Ahora mi pregunta: ¿Cuál es la mejor práctica para cerrar / vaciar el flujo de respuesta? ¿Hay alguna regla?


De acuerdo con ASP.NET establece la codificación de transferencia como fragmentada en el lavado prematuro de la Respuesta :

ASP.NET transfiere los datos al cliente en codificación fragmentada (Transfer-Encoding: chunked), si descarta prematuramente el flujo de respuesta para la solicitud Http y el encabezado Content-Length para la respuesta no lo establece explícitamente.

Solución : debe establecer explícitamente el encabezado Content-Length para que la Respuesta evite que ASP.NET corte la respuesta al vaciarse.

Aquí está el código C # que utilicé para evitar que ASP.NET dividiera la respuesta al configurar el encabezado requerido:

protected void writeJsonData (string s) { HttpContext context=this.Context; HttpResponse response=context.Response; context.Response.ContentType = "text/json"; byte[] b = response.ContentEncoding.GetBytes(s); response.AddHeader("Content-Length", b.Length.ToString()); response.BinaryWrite(b); try { this.Context.Response.Flush(); this.Context.Response.Close(); } catch (Exception) { } }



En mi caso, el problema estaba relacionado con el caché y ocurría al hacer una solicitud CORS.

Forzar el encabezado de respuesta Cache-Control a no-cache resolvió mi problema:

[usando el componente Symfony HttpFoundation ]

<?php $response->headers->add(array( ''Cache-Control'' => ''no-cache'' ));


Me encontraba con este error al generar un archivo y enviarlo al usuario para que lo descargue, pero solo ocasionalmente. Cuando no fallaba, el archivo era sistemáticamente corto en 2 bytes. Cerrar () cierra forzosamente la conexión, ya sea que haya finalizado o no, y en mi caso no lo fue. Dejarlo como se sugiere en la pregunta, significaba que el archivo resultante contenía tanto el contenido generado como el HTML para toda la página.

La solución aquí fue reemplazar

context.Response.Flush(); context.Response.Close();

con

context.Response.End();

Lo que hace lo mismo, pero sin acortar la transacción.


También estaba recibiendo el mismo error. Este problema fue con el permiso de usuario del servidor web en la carpeta de caché.