我最近遇到过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
删除最后一行后效果很好。我不知道为什么只有Chrome有这个问题,但看起来好像我在Chrome读完之前关闭了响应流。
我希望它能帮助那些遇到相同或类似问题的人。
现在我的问题: 关闭/刷新响应流的最佳实践是什么?有没有规则?
答案 0 :(得分:13)
根据ASP.NET sets the transfer encoding as chunked on premature flushing the Response:
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) { }
}
答案 1 :(得分:9)
我在生成文件并将其推送给用户下载时遇到此错误,但仅偶尔发生。当它没有失败时,文件总是短2个字节。关闭()强行关闭连接,无论它是否完成,在我的情况下它不是。如问题所示,将其删除意味着生成的文件既包含生成的内容,也包含整个页面的HTML。
此处的解决方案正在取代
context.Response.Flush();
context.Response.Close();
与
context.Response.End();
也是如此,但不会缩短交易时间。
答案 2 :(得分:2)
在我的情况下,问题与缓存有关,并且在执行CORS请求时发生。
强制回复标题Cache-Control
到no-cache
解决了我的问题:
[使用Symfony HttpFoundation组件]
<?php
$response->headers->add(array(
'Cache-Control' => 'no-cache'
));
答案 3 :(得分:1)
我也得到同样的错误。此问题与缓存文件夹上的Web服务器用户权限有关。
答案 4 :(得分:1)
由于他们的ASP.net核心项目出现问题导致有人登陆这里,我能够通过adding the IIS middleware解决。
在实例化您的webhost实例时由adding UseIISIntegration
完成。
答案 5 :(得分:0)
一旦我遇到了同样的问题,主要原因就是我的控制器返回类型。
如果您尝试仅按原样返回C# object
,则只会得到net::ERR_INCOMPLETE_CHUNKED_ENCODING
,因此请不要忘记在复杂对象之前序列化将其发送给java script
客户(或View
)。
即我的控制器返回类型为:
public async Task<List<ComplexModel>> GetComplexModelList(){
return new List<ComplexModel>()
}
哪个原因导致了INCOMPLETE_CHUNKED_ENCODING
错误,所以我尝试通过以下方式纠正错误:
using Newtonsoft.Json;
...
public async Task<string> GetComplexModelList(){
return JsonConvert.SerializeObject(new List<ComplexModel>())
}