2

サーバーからファイルをダウンロードできる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にリダイレクトする必要はありません。

4

2 に答える 2

1

GenericHandler を使用した例を次に示します。

public void ProcessRequest(HttpContext context)
{

  string filePath; // get from somewhere
  string contentType; // get from somewhere

  FileInfo fileInfo = new FileInfo(filePath);

  context.Response.Clear();
  context.Response.ContentType = contentType;
  context.Response.AddHeader("content-disposition", "attachment; filename=" + Path.GetFilename(filePath));
  context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
  context.Response.TransmitFile(filePath);
}
于 2012-04-20T12:21:05.047 に答える
1

クリックでポストバックし、コマンドが完了したことをViewStateに通知してページのコンテンツを更新するために応答を再生させないようにしていると思われます。

したがって、次のクリックでは、古いコマンドはまだ待機しており、ページごとに再送信されます。これで、2 つのコマンド (2 つの呼び出し) ができましたが、ビューステートを再び更新するために戻ることができず、ページは再び待機する必要があると考えています。

そして、これは次の呼び出しごとに続きます。コード ビハインドは、実際には前の呼び出しをすべて実行しようとします。

これに対する解決策は、ハンドラーへの直接リンクを作成し、ajax を使用してコード ビハインドから呼び出さないことです。

于 2012-04-20T11:59:29.633 に答える