chr*_*oph 19 c# iis google-chrome web-applications
我最近遇到了Chrome问题,我认为值得与您分享.
我使用HttpHandler处理自编写的API,主要应该返回json数据.但是当发生错误时我想显示一个html文件.这在IE和FF中效果很好,但在Chrome中却没有.
期待开发人员工具发现此错误:net :: ERR_INCOMPLETE_CHUNKED_ENCODING
谷歌对此问题的评价不是很多,而且非常受欢迎.我所知道的是,经过一段时间后,它神奇地消失了.
我发现它放在这行代码上:
result.StoreResult(context);
context.Response.Flush();
context.Response.Close(); //<-- this causes the error
Run Code Online (Sandbox Code Playgroud)
删除最后一行后效果很好.我不知道为什么只有Chrome有这个问题,但似乎我在Chrome读完之前关闭了响应流.
我希望它可以帮助那些遇到相同或类似问题的人.
现在我的问题是:关闭/刷新响应流的最佳实践是什么?有规则吗?
小智 13
ASP.NET会以分块编码(Transfer-Encoding:chunked)将数据传输到客户端,如果您过早地为Http请求刷新Response流,并且您没有明确设置Response的Content-Length头.
解决方案:您需要为Response显式设置Content-Length标头,以防止ASP.NET在刷新时分块响应.
这是我用来阻止ASP.NET通过设置所需标头来分块响应的C#代码:
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) { }
}
Run Code Online (Sandbox Code Playgroud)
小智 9
我在生成文件并将其推送给用户下载时遇到此错误,但仅偶尔发生.当它没有失败时,文件始终是2个字节的短.Close()强制关闭连接,无论它是否完成,在我的情况下它不是.如问题所示,将其遗漏,意味着生成的文件既包含生成的内容,也包含整个页面的HTML.
这里的解决方案正在取代
context.Response.Flush();
context.Response.Close();
Run Code Online (Sandbox Code Playgroud)
同
context.Response.End();
Run Code Online (Sandbox Code Playgroud)
它做同样的事情,但没有缩短交易时间.