ユーザーが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));
}
}
理想的には、ユーザーにポップアップを表示して、ユーザーが元のページに留まるようにします。