【问题标题】:ASPNET Core returning file fails using IE11? Content_Length Mismatch使用 IE11 的 ASP NET Core 返回文件失败?内容长度不匹配
【发布时间】:2017-12-23 20:43:37
【问题描述】:

我有一个返回文件的控制器方法,并且在除 IE11 之外的所有浏览器中都可以使用。在 IE11 中,我得到一个 500 服务器异常。在我的dotnet run 控制台命令中,我收到了这条消息。

失败:Microsoft.AspNetCore.Server.Kestrel[13] Connection id "0HLAA8HNC511P", Request id "0HLAA8HNC511P:00000007": 一个未处理的异常被抛出 应用。 System.InvalidOperationException:响应内容长度 不匹配:写入的字节太少(9283 个中的 0 个)。

我似乎也无法捕捉到异常,即使在我的 Startup.cs 文件中添加了 app.UseDeveloperExceptionPage(); 调用。

我的控制器方法很简单,长这样

public async Task<IActionResult> GetAsync([FromRoute] long id, [FromRoute] long fileId, [FromQuery] FilePreviewModel previewOptions)
{
    var entity = await _fileService.GetAsync(Module, id, fileId);

    var fileName = "MEARS 2000 LOGO";
    var contentType = "image/gif";

    // this is a byte array
    var data = entity.Data.Content;

    // return file content
    return File(data, contentType, fileName);
}

在 IE11 中,请求和响应标头如下所示。

在 chrome 中,我的标题看起来像这样。

我已将我的 dotnet SDK 更新到 2.1.3 版。

有人知道可能发生了什么吗?

【问题讨论】:

  • entity.Data.Content的类型是什么?是Stream 还是byte[] 数组。
  • byte[](更新了这个细节的帖子)抱歉没有说清楚
  • 这可能与github.com/aspnet/Mvc/issues/6875 有关。将Context.Request.Headers.Remove("If-Modified-Since"); 添加到您的操作中是否可以防止异常发生?
  • @Wazner 我认为该问题已在 2.1 中修复。 OP 正在使用 2.1.3
  • 我在 2.0.3 上试过这个,但没有用。我已经升级到 2.1.3 还是不行。我尝试在调用并返回File 之前添加HttpContext.Request.Headers.Remove("Content-Length");HttpContext.Request.Headers.Remove("If-Modified-Since");,但仍然遇到同样的问题。

标签: c# asp.net .net asp.net-mvc asp.net-web-api


【解决方案1】:

我也遇到过这个问题,但是它不会总是抛出错误。

设法通过删除操作中的标题来解决它,如下所示:

[HttpGet("{container}/{id}")]
public async Task<IActionResult> Get(string container, string id)
{
    /* remove both of these headers... put a warning here to apply the fix after dotnet team distributes the fix. */
    HttpContext.Request.Headers.Remove("If-Modified-Since");
    HttpContext.Request.Headers.Remove("If-None-Match");

    var _fileInfo = provider.GetFileInfo($"{container}/{id}");
    if (!_fileInfo.Exists || string.IsNullOrEmpty(id))
        /* return a default file here */

    var last = _fileInfo.LastModified;
    /* ... some code removed for brevity */

    return base.File(_fileInfo.CreateReadStream(), MimeTypeMap.GetMimeType(id.Substring(id.LastIndexOf("."))), id, lastModified: _lastModified, entityTag: _etag);
}

dotnet --info 显示version : 2.0.4

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 2016-12-02
    • 2019-08-17
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多