7

ユーザーがASP.NETWebハンドラー(.ashx)を介してPDFファイルをダウンロードできるWebページがあります。この質問の答えのように実装されています。私が抱えている問題は、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()が例外をスローしないようにできることを行っていますが、これはユーザー入力から生成されるため、エラーが発生するかどうかを予測できない/予測できない場合に備えて、ここでも処理します。

これが私が思いついた解決策の1つですが、(空白のページではなく)ユーザーエラーテキストが表示されます

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

理想的には、ユーザーにポップアップを表示して、ユーザーが元のページに留まるようにします。

4

2 に答える 2

7

まず第一に、私のこの答えについて、ユーザーはjavascriptを使用してダウンロードする方法を尋ねます。ただし、JavaScriptに追加する必要のないリンクがある場合は、通常のダウンロードリンクを使用して追加することもできます。

現在、多くのWebサイトでは、「ダウンロードは数秒で開始されます。開始されない場合は、ここをクリックしてください」というテキストを含むページを使用しています。理由の1つはあなたの理由と似ています。ユーザーは、何かが数秒でダウンロードを開始することを知っている必要があります。そうでない場合、ユーザーは他の余分なメッセージがないのに問題があることを理解します。

一般に、ダウンロード用にファイルを送信しようとすると、ページが表示されなくなり、ダウンロードの途中でメッセージを送信できなくなります。または、ファイルがpdfで終わる場合は、おそらく何も表示されません。 Webページで。したがって、私の観点から、問題が発生して例外をスローする場合は、問題が発生したことをユーザーに通知する方法についていくつかの手順を設計する必要があります。たとえば、「ファイルを受信するようになりました」とユーザーに通知する中央のページなどです。 -ファイルが数秒で​​ダウンロードを開始しない場合は、それを実行してください。」

ただし、ハンドラーで例外がスローされると、それらはハンドラーの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");
于 2013-01-31T00:05:44.327 に答える
3

ウィンドウのhrefを設定する代わりに、非表示のiframeのsrcを設定してはどうでしょうか。次に、非表示の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ステータスコードを取得する

これはアップロード用であり、ダウンロード用ではありませんが、同じ概念です。

于 2013-01-30T17:00:46.190 に答える