我有一个生成.pdf
文档的操作,并将其返回给浏览器内联查看。问题是浏览器正在向同一个动作发出第二个请求,导致应用程序每次生成文件时都会执行两次操作。这就是我所拥有的。
public ActionResult GeneratePDF(string id, int rp = 1, string info = "")
{
var doc = _service.GeneratePDF(id, rp, info);
var cd = new System.Net.Mime.ContentDisposition
{
FileName = $"{id}.pdf",
Inline = true,
Size = tickets.Length
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(doc, MimeMapping.GetMimeMapping(cd.FileName));
}
_service.GeneratePDF
使用iTextSharp在内存中生成PDF,MemoryStream
对象返回byte[]
从一些其他页面中的链接调用GeneratePDF操作:
<a href="SomeController/GeneratePDF/1234?rp=1" target="_blank">View Document</a>
此新浏览器标签上显示的唯一内容是.pdf
文档。
我尝试过不同的浏览器(Chrome,IE,FF),结果相同,.pdf
文件在浏览器上正常显示,但需要再次调用相同的操作。关于如何防止浏览器两次调用操作的任何想法?我在标题上遗漏了什么吗?
答案 0 :(得分:0)
您找到了解决方案吗? 我也有同样的问题。动作生成pdf文件。此操作被调用两次。
我将内容处理更改为附件而非内嵌,并且没问题,该操作只调用一次。但是,当然,文件已保存,不会显示在浏览器中。
答案 1 :(得分:0)
我遇到了完全相同的问题。请记住,我没有IDEA如何实际阻止这种情况发生,但如果有帮助,我会想出一个解决方法。我看了两个请求,发现第二个“虚假”请求的引用者是控制器动作路径本身(很奇怪)。但是,我也注意到第二个请求是从客户端断开连接并且已经请求取消(我猜这是为什么浏览器中的所有内容看起来都是o.k.)。我确信这些信息,以及对MVC /路线的更好理解,我最终可能会解释这一点。
无论如何,我所做的是将我的PDF生成/显示代码包装在客户端连接的检查中。如果断开连接,我将返回一个空视图结果。就像我说的那样,总的解决方法,但它让我超越了它,直到比我聪明的人能够解释发生了什么以及如何解决它。
if (Response.IsClientConnected)
{
if (pdfId == 0)
{
var model = _service.GetViewData(client, id);
model.StaffName = CTCHelper.GetStaffName(model.StaffId);
pdfId = _service.SavePDF(model, ControllerContext);
}
var data = _service.GetPDF(pdfId);
var mimeType = "application/pdf";
Response.AppendHeader("Content-Disposition", "inline; filename=TESI.pdf");
return File(data, mimeType);
}
Response.End();
return new ViewResult();