.NETMVC3中如何拦截当前actionresult的输出流?您好,感谢期待!背景我正在使用Rotativapdf工具将视图(html)读入PDF。它工作正常,但它本身并不提供将PDF保存到文件系统的方法。相反,它只是在操作后将文件返回到用户的浏览器。代码如下所示:publicActionResultPrintQuote(FormCollectionfc){intrevisionId=Int32.Parse(Request.QueryString["RevisionId"]);varpdf=newActionAsPdf("Quote",new{revisionId=revisionId}){FileName="Quote--"+revisionId.ToString()+".pdf",PageSize=Rotativa.Options.Size.Letter};返回pdf;}此代码调用另一个actionresult("Quote"),将其视图转换为PDF,然后将PDF作为文件下载返回给用户。问题如何拦截文件流并将PDF保存到我的文件系统。将PDF发送给用户是完美的,但我的客户还希望同时将PDF保存到文件系统。有任何想法吗?谢谢!Matt我遇到了同样的问题,这是我的解决方案:您基本上需要向您自己的URL发出HTTP请求并将输出保存为二进制文件。简单,无重载,辅助类和膨胀代码。你需要这个方法://返回获取请求的HTML页面的结果。publicstaticvoidSaveHttpResponseAsFile(stringRequestUrl,stringFilePath){try{HttpWebRequesthttpRequest=(HttpWebRequest)WebRequest.Create(RequestUrl);httpRequest.UserAgent="Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)";httpRequest.Headers.Add(HttpRequestHeader.AcceptEncoding,"gzip,deflate");HttpWebResponse响应=null;尝试{response=(HttpWebResponse)httpRequest.GetResponse();}catch(System.Net.WebExceptionex){if(ex.Status==WebExceptionStatus.ProtocolError)response=(HttpWebResponse)ex.Response;}使用(StreamresponseStream=response.GetResponseStream()){StreamFinalStream=responseStream;如果(response.ContentEncoding.ToLower().Contains("gzip"))FinalStream=newGZipStream(FinalStream,CompressionMode.Decompress);elseif(response.ContentEncoding.ToLower().Contains("deflate"))FinalStream=newDeflateStream(FinalSt令,CompressionMode.Decompress);使用(varfileStream=System.IO.File.Create(FilePath)){FinalStream.CopyTo(fileStream);}response.Close();FinalStream.Close();}}catch{}}然后在你的控制器中,你这样称呼它:SaveHttpResponseAsFile("http://localhost:52515/Management/ViewPDFInvoice/"+ID.ToString(),"C:\temp\test.pdf");瞧!该文件在您的文件系统上,您可以双击并打开PDF,或通过电子邮件将其发送给您的用户,或者您需要的任何内容.Options.Size.Letter};请在此处查看MVC管道图:http://www.simple-talk.com/content/file.ashx?file=6068呈现ActionResult后调用OnResultExecuted()方法。您可以使用属性覆盖此方法或使用ActionFilter和OnResultExecuted拦截器应用。编辑:在此论坛帖子的末尾,您会找到一个回复??,其中提供了一个读取(和更改)操作响应流的ActionFilter示例。然后您可以将流复制到文件并将其返回给客户端。我成功地使用了Aaron的“SaveHttpResponseAsFile”方法,但我不得不更改它,因为当前登录用户的凭据没有被应用(所以它转发到MVC4的登录URL)。publicstaticvoidSaveHttpResponseAsFile(System.Web.HttpRequestBaserequestBase,stringrequestUrl,stringsaveFilePath){try{*snip*httpRequest.Headers.Add(HttpRequestHeader.AcceptEncoding,"gzip,deflate");httpRequest.Header.Cookie(HttpRequest,requestBase.Headers["Cookie"]);*snip*然后在调用Controller方法中,只需将“Request”添加到SaveHttpResponseAsFile调用中。你也可以用Rotativa做,其实很简单。使用Rotativa;...byte[]pdfByteArray=Rotativa.WkhtmltopdfDriver.ConvertHtml("Rotativa","-q",stringHtmlResult);File.WriteAllBytes(输出路径,pdfByteArray);我在winforms应用程序中使用它,来自我们在Web应用程序中用于生成和保存PDF的Razor视图。我能够让EricBrown-Cal的解决方案工作,但我需要进行一些小的调整以防止出现有关未找到目录的错误。(此外,查看Rotativa代码,看起来-q开关已默认传递,因此可能没有必要,但我没有更改它。)以上是C#学习教程:.NETMVC3中如何拦截当前actionResult的输出流?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注——varbytes=Rotativa.WkhtmltopdfDriver.ConvertHtml(Server.MapPath(@"/Rotativa"),"-q”,html);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
