簡體   English   中英

從ASP.NET Web處理程序(.ashx)下載文件時的錯誤處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM