gpt4 book ai didi

c# - 从 ASP.NET Web 处理程序 (.ashx) 下载文件时的错误处理

转载 作者:数据小太阳 更新时间:2023-10-29 05:10:36 28 4
gpt4 key购买 nike

我有一个网页,用户可以通过 ASP.NET 网络处理程序 (.ashx) 下载 PDF 文件。它的实现就像这个question中的答案一样.我遇到的问题是,当我在我的 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));
}
}

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

最佳答案

首先在this answer of mine用户询问如何使用 javascript 进行下载。但如果您有链接,则不必将其添加到 javascript,您也可以使用常规下载链接添加它。

现在很多网站都使用带有一些文本的页面,上面写着“现在您的下载将在几秒钟内开始。如果没有开始,请单击此处 bla bla bla”。原因之一与您的类似,用户必须知道某些内容将在几秒钟内开始下载,如果没有,则用户明白没有其他额外消息存在问题。

一般来说,当你要发送一个文件进行下载时,你已经不在页面中了,你不能在下载过程中发送消息,或者当文件以 pdf 结尾时,那么可能不会发送在网页上显示任何内容。因此,从我的 Angular 来看,如果您确实遇到问题并抛出异常,则需要设计一些步骤来告知用户出现问题的方式 - 比如通知用户 “现在您要接收文件 - 如果文件没有在几秒钟内开始下载,请执行此操作“

However, when there is an exception thrown in the handler they are redirected to the URL of the handler and shown a blank page.

为避免黑页,出错时您可以返回该代码,用户将原样停留在页面上,但仍未收到任何错误消息。

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");

关于c# - 从 ASP.NET Web 处理程序 (.ashx) 下载文件时的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14609389/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com