1

短版:我有一个返回 FileResult 的第三方 MVC 扩展。我希望能够在将文件返回给客户端之前对其进行处理。我怎样才能做到这一点?

如果您对无聊的细节感兴趣,请阅读以下内容:

我将 Devexpress XtraReports 用于报告目的。问题是它的 PDF 导出很糟糕,但 RTF 的效果很好。我想创建动作和结果过滤器,它会欺骗 DevExpress 生成 rtf 而不是 pdf(完成),并使用其他第三方库将 rtf 转换为 pdf。唯一的问题是我需要从 FileResult 获取 rtf 文件并返回我自己的 FileResult 以及转换后的内容。

//编辑:现在的代码如下所示:

        public virtual ActionResult ReportExport(TParameters parameters)
        {
            return DevExpress.Web.Mvc.ReportViewerExtension.ExportTo(this.GetReport(parameters));    
        }
4

2 回答 2

4

您说您正在使用返回 a 的第三方 MVC 扩展,FileResult并且您希望访问包含在结果中的文件详细信息。

如果您看到FileResult,它是一个抽象类,我只知道 MVC 中提供了三个内置实现(我不知道其他实现)FileContentResultFileStreamResultFilePathResult.

所有这些类都提供公共属性来访问文件的详细信息。例如。FileContentResult包含一个名为的公共属性,FileContents它以字节数组的形式返回文件的内容。

第三方扩展可以返回FileResult内置类型的任何实现,或者(如果您无法访问这些类型)它们自己的类型。您可以检查返回FileResult的实例的类型并进行相应的转换以访问文件详细信息。

var fileResult = ... returned by the MVC extension

if(fileResult is FileContentResult)
{
   var fileContentResult = fileResult as FileContentResult;   
   var fileContent = fileContentResult.FileContents;
   // process the file
}
else if(fileResult is FileStreamResult)
{
   var fileStreamResult = fileResult as FileStreamResult;
   var fileStream = fileStreamResult .Stream;
   //...
}
else if(fileResult is FilePathResult) // this result only contains the path 
                                      // of the file name
{
  //...
}

如果您想让这些东西可重用,您可以实现一个自定义文件结果,该结果采用FileResult构造函数中的扩展返回并覆盖该WriteFile方法。

于 2012-05-28T11:59:58.510 回答
3

FileResult 可能会将文件内容写入响应流。您可以通过过滤器使用标准 ASP.NET 响应流。详情见这篇古文:

http://www.4guysfromrolla.com/articles/120308-1.aspx

或者,您可以创建自己的 ActionResult,使用带有假响应流的自定义 HttpContext 调用 DevExpress FileResult,这是您进行转换的地方。

于 2012-05-28T09:09:17.927 回答