如何拦截.NET MVC3中当前actionresult的输出流?

Mat*_*att 5 c# asp.net-mvc pdf-generation rotativa

嗨,谢谢你的期待!

背景

我正在使用Rotativa pdf工具将视图(html)读入PDF.它工作得很好,但它本身并没有提供将PDF保存到文件系统的方法.相反,它仅作为操作的结果将文件返回给用户的浏览器.

这是代码的样子:

public ActionResult PrintQuote(FormCollection fc)
        {
            int revisionId = Int32.Parse(Request.QueryString["RevisionId"]);

            var pdf = new ActionAsPdf(
                 "Quote",
                 new { revisionId = revisionId })
                       {
                           FileName = "Quote--" + revisionId.ToString() + ".pdf",
                           PageSize = Rotativa.Options.Size.Letter
                       };

            return pdf;

        } 
Run Code Online (Sandbox Code Playgroud)

此代码调用另一个actionresult("Quote"),将其视图转换为PDF,然后将PDF作为文件下载返回给用户.

如何拦截文件流并将PDF保存到我的文件系统.将PDF发送给用户是完美的,但我的客户也希望PDF同时保存到文件系统.

有任何想法吗?

谢谢!

马特

Aar*_*ron 3

我有同样的问题,这是我的解决方案:

\n\n

您基本上需要向自己的 URL 发出 HTTP 请求并将输出保存为二进制文件。简单,没有重载、辅助类和臃肿的代码。

\n\n

你需要这个方法:

\n\n
    // Returns the results of fetching the requested HTML page.\n    public static void SaveHttpResponseAsFile(string RequestUrl, string FilePath)\n    {\n        try\n        {\n            HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(RequestUrl);\n            httpRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";\n            httpRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");\n            HttpWebResponse response = null;\n            try\n            {\n                response = (HttpWebResponse)httpRequest.GetResponse();\n            }\n            catch (System.Net.WebException ex)\n            {\n                if (ex.Status == WebExceptionStatus.ProtocolError)\n                    response = (HttpWebResponse)ex.Response;\n            }\n\n            using (Stream responseStream = response.GetResponseStream())\n            {\n                Stream FinalStream = responseStream;\n                if (response.ContentEncoding.ToLower().Contains("gzip"))\n                    FinalStream = new GZipStream(FinalStream, CompressionMode.Decompress);\n                else if (response.ContentEncoding.ToLower().Contains("deflate"))\n                    FinalStream = new DeflateStream(FinalStream, CompressionMode.Decompress);\n\n                using (var fileStream = System.IO.File.Create(FilePath))\n                {\n                    FinalStream.CopyTo(fileStream);\n                }\n\n                response.Close();\n                FinalStream.Close();\n            }\n        }\n        catch\n        { }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在你的控制器中,你可以这样调用它:

\n\n
SaveHttpResponseAsFile("http://localhost:52515/Management/ViewPDFInvoice/" + ID.ToString(), "C:\\\\temp\\\\test.pdf");\n
Run Code Online (Sandbox Code Playgroud)\n\n

瞧\xc3\xa0!该文件位于您的文件系统中,您可以双击并打开 PDF,或通过电子邮件将其发送给您的用户,或者您需要的任何内容。

\n