【问题标题】:IIS & Chrome: failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODINGIIS & Chrome:加载资源失败:net::ERR_INCOMPLETE_CHUNKED_ENCODING
【发布时间】:2014-04-08 19:09:49
【问题描述】:

我最近遇到了一个 Chrome 问题,我认为值得与您分享。

我使用 HttpHandler 编写了一个自己编写的 API,该 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 完成读取之前关闭了响应流。

希望对遇到相同或类似问题的人有所帮助。

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

【问题讨论】:

  • 查看此资源Response.End, Response.Close, and How Customer Feedback Helps Us Improve MSDN Documentation;我在尝试发送分块响应时遇到同样的问题,也许您的响应是分块的(默认情况下)。
  • 我对包装在 JSONP 回调中的本地 JSON 文件有完全相同的问题。当我从远程 CDN 请求文件时也会发生这种情况。
  • 就我而言,我遇到了net::ERR_INCOMPLETE_CHUNKED_ENCODING 错误,因为服务器的网线没有完全连接。
  • 我最近发现我的卡巴斯基阻止了超过 2MB 的响应,这导致了这个错误。我必须暂停卡巴斯基保护才能正确加载页面。
  • 您是否尝试过并得到最终解决方案?

标签: c# google-chrome iis web-applications


【解决方案1】:

一旦我遇到同样的问题,主要原因在于我的控制器返回类型。 如果您尝试按原样返回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>())
}

【讨论】:

  • 那么当我们在本地调试它时为什么它不抛出?当我尝试打开我的托管应用程序时出现此错误
【解决方案2】:

如果有人因为 ASP.net Core 项目的问题而登陆这里,我可以通过adding the IIS middleware 解决。

这是由adding UseIISIntegration 在实例化您的虚拟主机实例时完成的。

【讨论】:

  • 您能否详细说明一下。我已经添加了 UseIISIntegration 但我仍然收到此错误。我需要配置任何选项吗?
  • 我也打算研究这个解决方案,但第一个链接不再存在,第二个是 Microsoft Docs 解释 CreateDefaultBuilder() 已经调用 UseIISIntegration。所以我不知道这是否意味着上述情况已经在 .Net Core 中发生,或者因为我的program.cs 按照说明创建了默认构建器。
【解决方案3】:

我在生成文件并将其推送给用户进行下载时遇到了这个错误,但只是偶尔。当它没有失败时,该文件始终短 2 个字节。 Close() 强制关闭连接,无论它是否完成,在我的情况下它没有。正如问题中所建议的那样,将其保留意味着生成的文件既包含生成的内容,也包含整个页面的 HTML。

这里的解决方案是替换

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

context.Response.End();

其作用相同,但不会缩短交易时间。

【讨论】:

    【解决方案4】:

    根据ASP.NET sets the transfer encoding as chunked on premature flushing the Response

    ASP.NET 以分块编码(Transfer-Encoding: chunked)将数据传输到客户端,如果您过早地刷新 Http 请求的响应流并且响应的 Content-Length 标头未由您明确设置。

    解决方案:您需要为响应显式设置 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) { }
    }
    

    【讨论】:

    • 我还没有解决方案。 Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING 参考: stackoverflow.com/questions/37434368/…forums.asp.net/p/2095940/… - 在使用 UpdatePanels 的 Chrome 中可能出现 Content-Length 问题。我不知道。
    • 我在IExceptionFilter 中遇到了同样的问题,设置Content-Length 有帮助!谢谢
    【解决方案5】:

    我也遇到了同样的错误。此问题与缓存文件夹的 Web 服务器用户权限有关。

    【讨论】:

      【解决方案6】:

      在我的情况下,问题与缓存相关,并且在执行 CORS 请求时发生。

      将响应头 Cache-Control 强制更改为 no-cache 解决了我的问题:

      [使用 Symfony HttpFoundation 组件]

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

      【讨论】:

        猜你喜欢
        • 2015-08-17
        • 2019-08-22
        • 2011-06-21
        • 2023-03-24
        • 2014-04-14
        • 2014-06-24
        • 2018-10-10
        • 2014-07-06
        相关资源
        最近更新 更多