HttpResponseMessage 不返回 ByteArrayContent - ASP.NET Core

Posted

技术标签:

【中文标题】HttpResponseMessage 不返回 ByteArrayContent - ASP.NET Core【英文标题】:HttpResponseMessage not returning ByteArrayContent - ASP.NET Core 【发布时间】:2017-08-09 07:30:06 【问题描述】:

我将文件存储在数据库中,需要 Web API 才能返回。数据库调用正确地返回了正确的字节数组(断点显示数组的长度约为 67000,这是正确的),但是当我调用 Web API 时,我从未在响应中得到该内容。我试过使用 MemoryStream 和 ByteArrayContent,但都没有给我应该得到的结果。我已经尝试从 Postman 和我的 MVC 应用程序调用,但都没有返回字节数组,只返回带有 headers/success/etc 的基本响应信息。

public HttpResponseMessage GetFile(int id)

    var fileToDownload = getFileFromDatabase(id);
    if (fileToDownload == null)
    
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    
    var response = new HttpResponseMessage(HttpStatusCode.OK);
    response.Content = new ByteArrayContent(fileToDownload.FileData); //FileData is just a byte[] property in this class
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    return response;

我得到的典型响应(在任何地方都找不到字节内容):


  "version": 
    "major": 1,
    "minor": 1,
    "build": -1,
    "revision": -1,
    "majorRevision": -1,
    "minorRevision": -1
  ,
  "content": 
    "headers": [
      
        "key": "Content-Disposition",
        "value": [
          "attachment"
        ]
      ,
      
        "key": "Content-Type",
        "value": [
          "application/octet-stream"
        ]
      
    ]
  ,
  "statusCode": 200,
  "reasonPhrase": "OK",
  "headers": [],
  "requestMessage": null,
  "isSuccessStatusCode": true

也许我误解了我应该如何处理这些数据,但我觉得这应该是从 Web API 调用返回的,因为我明确添加了它。

【问题讨论】:

您能确保您请求的操作方法正确吗?关于 GetFile 操作方法不会返回您描述的 JSON 结果。 Joe 的评论解决了我的问题。我遗漏了文件上方的 Route 属性...调用是正确的,对不起! 【参考方案1】:

我认为您应该使用 FileContentResult,并且可能比“application/octet-stream”更具体的内容类型

public IActionResult GetFile(int id)

    var fileToDownload = getFileFromDatabase(id);
    if (fileToDownload == null)
    
        return NotFound();
    

    return new FileContentResult(fileToDownload.FileData, "application/octet-stream");

【讨论】:

哦,哇,是的,这肯定会得到正确的结果。谢谢。在这方面花费了太长时间,大多数 *** 线程都试图强制使用 HttpResponseMessage,获得了隧道远见,试图找出如何解决该解决方案。如果我要拥有多种数据类型(图像、PDF、Office 格式等),是否有更好的 Content-Type?还是最好像八位字节流一样保留它?我想我对不同的内容类型了解不多。 我认为您应该在将文件放入数据库时​​捕获 mime 类型,并将其作为 fileToDownload 的属性。您可能可以使用静态文件包中的FileExtensionContentTypeProvider 来执行此操作或自己滚动 如果有人想知道这个和File() 之间的区别是什么,File()(在Controller 上)调用这个方法。

以上是关于HttpResponseMessage 不返回 ByteArrayContent - ASP.NET Core的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API 2 的返回结果

返回 HttpResponseMessage 的 Web API 最佳方法

返回 HttpResponseMessage 时的 WebAPI Gzip

WEB API HttpResponseMessage 返回 JSONP

HttpResponseMessage.Content.ReasAsString 返回一个空字符串

ASP.NET MVC 网站(不是项目)是不是可以返回 HttpResponseMessage