是什么在ASP.NET MVC的四个文件结果之间的差异(What's the differe

2019-06-17 16:10发布

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

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

这些描述采取从MSDN并与FileStreamResult除外的前三个声音相同。 那么它们之间有什么区别呢?

Answer 1:

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

  • FileContentResult -您使用它,当你有一个字节数组,你想退回的文件
  • FilePathResult -当你有一个磁盘文件,并想返回其内容(你给一个路径)
  • FileStreamResult -你有流开,你想它的内容返回为一个文件

然而,你很少有使用这些类-你可以只使用一个Controller.File过载,并让ASP.NET MVC做魔术给你。



Answer 2:

大问题...,值得更多的细节。 我发现自己这里的一个有趣的情况的结果。 我们通过MVC3 / C#环境提供一些PDF附件。 我们的代码得到释放,我们开始收到来自我们的客户,在下载举止异常,当他们使用Chrome和文件类型正在转换到“PDF-,attachment.pdf-,附件”一些回应。 是啊......你说对了......整个事情。 所以,一个可以重写它仅仅是“PDF”,文件仍然保存完好,但什么乱七八糟的!

所以,来形容最初的情况,我们设定那么“内容处置”头返回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代替(保持内容处置制定者):

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的问题! 嗯......但为什么在赫克我应该把我的完美的字节数组和流,然后通过这个返回它来获取文件名的工作吧?

随后赶来的提琴手。

随着FileContentResult,我在头2内容处分权。 随着FileStreamResult,我得到了1。

FileContentResult提供文件名和Chrome认为这个标题为错误的倍数时,附加一个Content-Disposition头。

奇怪的反应......但肯定一个是很好的了解。



文章来源: What's the difference between the four File Results in ASP.NET MVC