ASP.NET MVC中的四个文件结果有什么区别?

ASP.NET有四种不同types的文件结果:

  • FileContentResult:将二进制文件的内容发送到响应。
  • FilePathResult:将文件的内容发送到响应
  • FileResult:返回写入响应的二进制输出
  • FileStreamResult:通过使用Stream实例将二进制内容发送到响应

这些描述是从MSDN和除了FileStreamResult的前三个声音相同。 那么他们之间有什么区别呢?

FileResult是所有其他的抽象基类。

  • FileContentResult – 当你想要返回一个字节数组作为文件时使用它
  • FilePathResult – 当你有一个文件在磁盘上,并想要返回它的内容(你给一个path)
  • FileStreamResult – 你打开一个stream,你想把它的内容作为一个文件返回

然而,你很less必须使用这些类 – 你可以使用Controller.File重载之一,让asp.net mvc为你做魔术

很好的问题…值得更多的细节。 我发现自己在这里是一个有趣的情况的结果。 我们通过MVC3 / C#环境提供了一些pdf附件。 我们的代码已经发布,我们开始从我们的客户那里得到一些回应,他们使用Chrome并且文件types被转换为“pdf-,attachment.pdf-,attachment”时下载的行为很奇怪。 是的…你明白了…整个事情 所以,可以重写它只是'pdf',文件仍然可以保存完好,但是真是太乱了!

所以,为了描述最初的情况,我们设置了“Content-Disposition”头,然后返回一个FileContentResult …

 var cd = new System.Net.Mime.ContentDisposition { FileName = result.Attachment.FileName, Inline = false }; Response.AppendHeader("Content-Disposition", cd.ToString()); return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName); 

看起来不错。 在IE中工作得很好。 所以我做了一些研究,并尝试实现FileStreamResult来代替(保留Content-Disposition setter):

 MemoryStream dataStream = new MemoryStream(); dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length); dataStream.Position = 0; return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName)); 

它解决了Chrome中的问题! 嗯…但为什么在这个问题,我应该把我的完美的字节数组和stream,然后返回它通过这个让文件名正常工作?

然后是小提琴手。

使用FileContentResult,我在头文件中获得了2个Content-Disposition。 用FileStreamResult,我得到了1。

当提供文件名时,FileContentResult附加一个Content-Disposition头,Chrome会将此头的倍数视为错误。

奇怪的反应…但绝对是一个很好的知道。