IIS& Chrome:无法加载资源:net :: ERR_INCOMPLETE_CHUNKED_ENCODING

时间:2014-03-06 09:00:58

标签: c# google-chrome iis 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

删除最后一行后效果很好。我不知道为什么只有Chrome有这个问题,但看起来好像我在Chrome读完之前关闭了响应流。

我希望它能帮助那些遇到相同或类似问题的人。

现在我的问题: 关闭/刷新响应流的最佳实践是什么?有没有规则?

6 个答案:

答案 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-Controlno-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>())
}