我有一个返回文件的控制器方法,在所有浏览器中,此方法都与IE11分开。在IE11中,我得到了500个服务器异常。在我的dotnet run控制台命令中,我收到此消息。


  失败:Microsoft.AspNetCore.Server.Kestrel [13]
        连接ID“ 0HLAA8HNC511P”,请求ID“ 0HLAA8HNC511P:00000007”:客户端抛出了未处理的异常
  应用。 System.InvalidOperationException:响应内容长度
  不匹配:写入的字节太少(9283中的0)。


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

我的控制器方法非常简单,看起来像这样

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中,请求和响应头看起来像这样。

c# - 使用IE11的ASPNET Core返回文件失败? Content_Length不匹配-LMLPHP

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

c# - 使用IE11的ASPNET Core返回文件失败? Content_Length不匹配-LMLPHP

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

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

最佳答案

我也有这个问题,相反,它不会总是抛出错误。

通过删除操作中的标头来解决此问题,如下所示:

[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

关于c# - 使用IE11的ASPNET Core返回文件失败? Content_Length不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47955880/

10-13 06:03