C# 从ASP.NET Web处理程序(.ashx)下载文件时出错处理

C# 从ASP.NET Web处理程序(.ashx)下载文件时出错处理,c#,javascript,asp.net,download,C#,Javascript,Asp.net,Download,我有一个网页,用户可以通过ASP.NET web处理程序(.ashx)下载PDF文件。它是这样实现的。我的问题是当我这样做时window.top.location.href=url在我的JavaScript中,如果处理程序中抛出异常,我无法真正控制会发生什么。当一切正常运行时,用户体验是他们基本上停留在他们所在的页面上,浏览器告诉他们可以下载PDF文件。但是,当处理程序中抛出异常时,它们将被重定向到处理程序的URL,并显示一个空白页面 下面是一些示例代码,以使其更加清晰: JavaScript:

我有一个网页,用户可以通过ASP.NET web处理程序(
.ashx
)下载PDF文件。它是这样实现的。我的问题是当我这样做时
window.top.location.href=url
在我的JavaScript中,如果处理程序中抛出异常,我无法真正控制会发生什么。当一切正常运行时,用户体验是他们基本上停留在他们所在的页面上,浏览器告诉他们可以下载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()引发异常,但它是由用户输入生成的,因此我们也在这里处理它,以防出现我们无法/无法预测哪种情况会生成错误的情况

下面是我提出的一个解决方案,但它显示了用户错误文本(而不是空白页)


理想情况下,我想向用户显示一个弹出窗口,这样他们就可以留在原来的页面上

与其设置窗口的href,不如设置隐藏iframe的src。然后,您可以对隐藏iframe中的返回值进行一些欺骗,例如:

context.Response.Clear();
context.Response.Write("<script>alert('" + GetErrorMessage(e) + "');</script>");
context.Response.Clear();
Write(“警报(“+”GetErrorMessage(e)+“);”;
这个粗糙的示例只是警告错误消息。如果你在同一个域上(我怀疑你是!),那么你可以更聪明地调用父域中的方法,而不是发出警报,例如

context.Response.Clear();
context.Response.Write("<script>window.parent.someFunction('" + GetErrorMessage(e) + "');</script>");
context.Response.Clear();
context.Response.Write(“window.parent.someFunction”(“+GetErrorMessage(e)+”;”);
下面是我发现的一个这样做的例子:

它用于上传,不是下载,而是相同的概念。

首先,用户询问如何使用javascript进行下载。但是,如果您有不需要将其添加到javascript的链接,也可以使用常规下载链接添加该链接

现在,许多网站使用的页面上都有这样的文字:“现在,您的下载将在几秒钟内开始。如果不开始,请单击此处bla bla bla”。其中一个原因与您的原因类似,用户必须知道几秒钟后会有什么东西开始下载,如果没有,那么用户就会明白没有其他额外消息会有问题

一般来说,当你要发送一个文件下载时,你不再在页面中,你不能在下载的中间发送消息,或者当文件以PDF结尾时,很可能不会在网页上显示任何东西。因此,从我的观点来看,如果你确实存在问题并抛出异常,你需要设计一些步骤,告诉用户出了问题-比如中间的页面告诉用户“现在你将收到一个文件-如果文件在几秒钟内没有开始下载,请这样做”

但是,当处理程序中抛出异常时,它们是 重定向到处理程序的URL并显示一个空白页

为了避免出现黑色页面,在出现错误时,您可以返回该代码,用户将保持页面不变,但仍然没有收到任何错误消息

Response.TrySkipIisCustomErrors = true;
Response.Status = "204 No Content";
Response.StatusCode = 204;
Response.End();
在异常情况下,您可以尝试使用

Response.Redirect("errorpage.aspx");
也许你可以在那里发送一些错误ID

您也可以尝试将一条简单的消息显示为

context.Response.ContentType = "text/html";
context.Response.Write("Error downloading file - Please contact with us");

如果您已经准备好以PDF格式发送标题,那么除了发送一页错误代码(如-page not found-)之外,很难发送其他消息,但是如果您没有以PDF格式发送标题和文件名标题,那么您可以像以前那样编写消息。现在在对话框中停留在页面上是不可能的,因为您已经准备好转到其他页面,第一个页面不再具有控件。感谢您的响应-您的响应。重定向是我们的答案。
context.Response.ContentType = "text/html";
context.Response.Write("Error downloading file - Please contact with us");