我有一个网页,用户可以通过 ASP.NET Web 处理程序 ( .ashx
) 下载 PDF 文件。它的实现方式与此问题中的答案类似。我遇到的问题是,当我在 JavaScript 中执行此window.top.location.href = url;
操作时,如果处理程序中抛出异常,我无法真正控制会发生什么。当一切正常时,用户体验是他们基本上停留在他们所在的页面上,并且浏览器告诉他们他们可以下载 PDF 文件。但是,当处理程序中抛出异常时,它们将被重定向到处理程序的 URL 并显示一个空白页面。
以下是一些示例代码,以使其更清晰:
JavaScript:
function openPDF() {
var url = GeneratePDFUrl();
window.top.location.href = url;
}
处理程序:
public override void Process(HttpContext context)
{
byte[] pdfdata = GetPDFData();
context.Response.ContentType = "application/pdf";
context.Response.AddHeader("content-disposition", "attachment; filename=\"" + GetPDFFileName() + "\"");
context.Response.AddHeader("content-length", pdfdata.Length.ToString());
context.Response.BinaryWrite(pdfdata);
}
当 GetPDFData() 抛出异常时,就会出现问题。我们正在尽我们所能防止 GetPDFData() 抛出异常,但它是从用户输入生成的,因此我们也在此处处理它,以防出现我们无法/无法预测哪些情况会产生错误。
这是我提出的一种解决方案,但它显示了用户错误文本(而不是空白页)
public override void Process(HttpContext context)
{
try
{
byte[] pdfdata = GetPDFData();
WritePDF(pdfdata, GetPDFFileName()); // Executes code in example above
}
catch (Exception e)
{
context.Response.Clear();
context.Response.Write(GetErrorMessage(e));
}
}
理想情况下,我想向用户显示一个弹出窗口,以便他们留在他们所在的页面上。