サーバーからファイルをダウンロードできるWebアプリケーションがあります。ドキュメントは、Officeファイル(.docx、pptx、.xslx)またはPdfの場合があります。
ロジックは非常に単純です。クライアント側からクリックすると、Webサービスが呼び出され、必要なパラメーターを渡すaspxページ(Print.aspx)が呼び出されます。印刷ページはWebサービスを呼び出して、選択したドキュメントバイナリを取得し、応答に書き込みます。
protected void Page_Load(object sender, EventArgs e)
{
string fileName = Request.QueryString["fname"];
if (string.IsNullOrEmpty(documentID) == false)
{
byte[] document = GetPhysicalFile(documentID); //Get the binaries
showDownloadedDoc(document, fileName);
}
}
private void showDownloadedDoc(byte[] document, string fileName)
{
Response.Clear();
Response.ContentType = contentType;
Response.AppendHeader("content-disposition", string.Format("attachment; filename=\"{0}\"", fileName));
Response.BufferOutput = false;
Response.BinaryWrite(document);
Response.Close();
}
PDFドキュメントはPrint.aspxページで開かれ、aspxページは1回だけロードされます。Officeファイルの場合、Page_Load()メソッドが3回呼び出されます。
たとえば、ドキュメントを開く/保存するダイアログが最初に開かれ、[開く] icがクリックされた場合、Page_Loadが2回呼び出され、その後、ドキュメントは最終的にMSWordに表示されます。
これらのドキュメントを開くために複数のページが読み込まれるのを防ぐ方法はありますか?アクセスごとにファイルが作成されるため、サーバー側でファイルを保存してそのURLにリダイレクトする必要はありません。