![](/img/trans.png)
[英]ASP.NET Server error in '/' application - ashx handler
[英]Error handling when downloading file from ASP.NET Web Handler (.ashx)
我有一個網頁,用戶可以通過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()拋出異常,但它是從用戶輸入生成的,所以我們也在這里處理它,以防有時我們不能/無法預測哪些會產生錯誤。
這是我提出的一個解決方案,但它顯示了用戶錯誤文本(而不是空白頁)
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));
}
}
理想情況下,我想向用戶顯示一個彈出窗口,以便他們留在他們所在的頁面上。
首先,在我的這個答案中 ,用戶詢問如何使用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");
如何設置隱藏的iframe的src而不是設置窗口的href。 然后,您可以使用隱藏的iframe中的返回值進行一些欺騙,例如:
context.Response.Clear();
context.Response.Write("<script>alert('" + GetErrorMessage(e) + "');</script>");
這個粗略的例子只會提醒錯誤信息。 如果你在同一個域名(我懷疑你是那個!)那么你可以更聰明,而不是提醒,在父母中調用方法,例如
context.Response.Clear();
context.Response.Write("<script>window.parent.someFunction('" + GetErrorMessage(e) + "');</script>");
這是我在SO上發現的一個例子: 使用Javascript從加載的iframe中檢索HTTP狀態代碼
這是一個上傳,而不是下載,但相同的概念。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.