Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IIS & Chrome: failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING

I recently came across a Chrome issue which I think is worth sharing it with you.

I worked on a self written API using an HttpHandler which primary should return json data. But when an error occures I wanted to display an html file. That worked pretty well in IE and FF, but not in Chrome.

Looking to the developer tools revealed this error: net::ERR_INCOMPLETE_CHUNKED_ENCODING

Google said not very much about this issue while it was seen very much. All I got to know was, that it was magically disappearing after some time.

I found out it lays on this lines of code:

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

After removing the last line it worked well. I don´t know why only Chrome had/has an issue with that, but it seemed as if I closed the response stream before chrome finished reading it.

I hope it helps those of you coming across the same or a similar issue.

Now my question: How is the best pratice in closing/flushing the response stream? Are there any rules?

like image 356
christoph Avatar asked Mar 06 '14 09:03

christoph


People also ask

What is the IIS used for?

Internet Information Services (IIS) Internet Information Services (IIS) is a flexible, general-purpose web server from Microsoft that runs on Windows systems to serve requested HTML pages or files. An IIS web server accepts requests from remote client computers and returns the appropriate response.

What is IIS service called?

Microsoft Internet Information Services (IIS, formerly called Internet Information Server) is a set of Internet-based services for servers using Microsoft Windows. The servers currently include FTP, SMTP, NNTP, WebDAV and HTTP/HTTPS.

What is IIS in software development?

Purpose. Internet Information Services (IIS) turns a computer into a Web server that can provide World Wide Web publishing services, File Transfer Protocol (FTP) services, Simple Mail Transport Protocol (SMTP) services, and Network News Transfer Protocol (NNTP) services.

Is IIS a web or application server?

Microsoft IIS (Internet Information Services) is a free web server software package for Windows Server. IIS only runs on Windows operating systems.


3 Answers

According to ASP.NET sets the transfer encoding as chunked on premature flushing the Response:

ASP.NET transfers the data to the client in chunked encoding (Transfer-Encoding: chunked), if you prematurely flush the Response stream for the Http request and the Content-Length header for the Response is not explicitly set by you.

Solution: You need to explicitly set the Content-Length header for the Response to prevent ASP.NET from chunking the response on flushing.

Here's the C# code that I used for preventing ASP.NET from chunking the response by setting the required header:

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) { } } 
like image 171
rumis Avatar answered Oct 02 '22 16:10

rumis


I was running into this error when generating a file and pushing it to the user for download, but only occasionally. When it didn't fail, the file was consistently 2 bytes short. Close() forcibly closes the connection, whether it's finished or not, and in my case it was not. Leaving it out, as suggested in the question, meant the resulting file contained both the generated content as well as the HTML for the entire page.

The solution here was replacing

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

with

context.Response.End(); 

which does the same, but without cutting the transaction short.

like image 37
Pawtuxet Avatar answered Oct 02 '22 15:10

Pawtuxet


In my case, the problem was cache-related and was happening when doing a CORS request.

Forcing the response header Cache-Control to no-cache resolved my issue:

[ using Symfony HttpFoundation component ]

<?php
$response->headers->add(array(
   'Cache-Control' => 'no-cache'
));
like image 29
eightyfive Avatar answered Oct 02 '22 17:10

eightyfive