6

ダウンロードのためにファイルをユーザーに送信した後、いくつかのメソッドを実行する必要があります。ファイルをユーザーに送信した後、応答が中止され、その後何もできなくなりますresponse.end()

たとえば、これは私のサンプル コードです。

 Response.Clear();
 Response.AddHeader("content-disposition", "attachment;  filename=test.pdf");
 Response.ContentType = "application/pdf";
 byte[] a = System.Text.Encoding.UTF8.GetBytes("test");
 Response.BinaryWrite(a);
 Response.End();
 StartNextMethod();
 Response.Redirect(URL);

したがって、この例ではStartNextMethodandResponse.Redirectは実行されていません。

私が試したのは、次のコードで別のハンドラー (ashx) を作成したことです。

public void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();
            context.Response.AddHeader("content-disposition", "attachment;  filename=test.pdf");
            context.Response.ContentType = "application/pdf";
            byte[] a = System.Text.Encoding.UTF8.GetBytes("test");
            context.Response.BinaryWrite(a);
            context.Response.End();
        }

次のように呼び出します。

Download d = new Download();
d.ProcessRequest(HttpContext.Current);
StartNextMethod();
Response.Redirect(URL);

しかし、同じエラーが発生します。Response.End を CompleteRequest に置き換えようとしましたが、役に立ちません。

問題は、私が HttpContext.Current を使用していることですが、別の応答ストリームを使用する必要があると思います。あれは正しいですか?一般的に別のメソッドでそれを行うにはどうすればよいですか (ハン​​ドラーがデータとコンテンツタイプのバイト配列を受け入れ、別の応答からダウンロードできるようにしたいとします。応答に別のページを使用したくありません。

更新
まだ良い解決策が見つかりませんでした。ユーザーがファイルをダウンロードした後にいくつかのアクションを実行したいのですが、応答\要求のために別のページを使用する必要はありません。

4

8 に答える 8

7

更新
2 ページ目はないと言っていたので、代わりにこれを行います。クエリ文字列パラメーター (fileid やパスなど) をチェックするセクションをページに追加します。この値が存在する場合、既存のコードを使用してダウンロード プロセスが開始されます。この値が存在しない場合は、通常どおりに実行されます。

ユーザーがダウンロード リンクをクリックすると、ポスト バックが実行されます (既に実行しています)。この投稿では、ページに iFrame を作成し、クエリ文字列パラメーター (mypage.aspx?id=12664 または ?download=true など) を追加して、iFrame の URL をページの URL に設定します。iframeを作成した後、追加のデータバインドなどを実行します...あなたも望みます。


- http://encosia.com/ajax-file-downloads-and-iframes/

上記のリンクされた例では、あなたが話しているように、iFrame と更新パネルを使用しています。

元の投稿
Response.Flush を使用すると、ファイルをユーザーに送信した後も処理を続行できます。または、Response.End を呼び出さないでください (実際には必要ありません)。

ただし、Daniel A. White は正しいです。ファイルを送信した後、コードから実際にリダイレクトすることはできません。リダイレクトしようとすると、エラーが発生します。ただし、必要に応じて他のサーバー側の操作を引き続き実行できます。

他の回答は一般的なコンセンサスに同意します。ファイルのダウンロードが開始された後にリダイレクトすることはできません: https://stackoverflow.com/a/822732/328968 (PHP、ただし、一般的に HTTP が関与するため同じ概念)。またはファイルをダウンロードした後、新しいページに移動します

于 2012-06-01T15:48:29.830 に答える
5

Response.End()は、スレッド アボート例外をスローします。これは、応答を終了するように設計されています。その後のコードはそのスレッドで処理されません。

End メソッドにより、Web サーバーはスクリプトの処理を停止し、現在の結果を返します。ファイルの残りの内容は処理されません。

あなたが達成しようとしていることは何ですか?

PDFのダウンロードを許可してから、ユーザーを他のページに移動させることが目的の場合は、小さなJavaScriptが役立ちます。

タイマー付きのスクリプトを追加して、リダイレクトされたページに location.href を設定します。

于 2012-05-28T05:08:10.760 に答える
1

以前の回答で述べたように、PDFファイルを返すことはHTTPヘッダーを送信することを意味します。その後、別のヘッダーを送信することはできません。Response.Redirect()は、単にHTTP302を送信することを意味します。

別のページを作成したくない場合、またはAJAXを使用したくない場合は、次のことを試してみてください。

<head>
    <meta http-equiv="refresh" content="3; url=http://www.site.com/download.aspx?xxxx">
</head>

実際には、これにより、ユーザーに表示したいページが表示され、3秒後にPDFファイルのダウンロード用のURLでページが更新されます。

于 2012-06-01T21:13:29.493 に答える
1

ASP.NET でのファイルのダウンロードとダウンロードの成功/失敗のステータスの追跡、またはこの質問への回答に示されているように、ファイルをチャンクでダウンロードします。ファイルの最後のチャンクがクライアントに書き込まれると、必要なコードを実行できます。(最後である必要はありません。必要に応じて、その間のどこでもかまいません。)

于 2012-06-04T16:29:40.067 に答える
0

ユーザーがダウンロード ボタンをクリックしてWebForm1.aspx、ファイルのダウンロードを開始します。次に、ファイルのダウンロードが完了すると (によって提供されますWebForm2.aspx)、ユーザーは自動的にリダイレクトされます。

WebForm1.aspx

<script type="text/javascript">
    $(document).ready(function () {
        $('#btnDL').click(function () {
            $('body').append('<iframe src="WebForm2.aspx" style="display:none;"></iframe>');
            return true;
        });
    });
</script>
<asp:Button runat="server" ID="btnDL" ClientIDMode="Static" Text="Download" OnClick="btnDL_Click" />

WebForm1.aspx.cs

protected void btnDL_Click(object sender, EventArgs e)
{
    var sent = Session["sent"];

    while (Session["sent"]==null)
    {// not sure if this is a bad idea or what but my cpu is NOT going nuts
    }

    StartNextMethod();
    Response.Redirect(URL);

}

WebForm2.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    Response.Clear();
    Response.AddHeader("content-disposition", "attachment;  filename=test.pdf");
    Response.ContentType = "application/pdf";
    byte[] a = System.Text.Encoding.UTF8.GetBytes("test");
    Response.BinaryWrite(a);
    Session["sent"] = true;
}

Global.asax.cs

protected void Session_Start(object sender, EventArgs e)
{
    Session["init"] = 0; // init and allocate session data storage
}

注: ダウンロードの提供に ashx (汎用ハンドラー) を使用しないでください。何らかの理由で、これを実装しない限り、ashx と aspx のセッションは互いに通信しません。

于 2012-05-28T06:23:20.853 に答える
0

あなたが試みていることはうまくいかないと思います。

これは私がすることです:

  1. ローカルでファイルにコンテンツを書き込み、一意の ID を割り当てます
  2. 一意の ID (javascript) でリクエストを実行する隠しフレームを含む次のページにユーザーを送信します
  3. 非表示のリクエスト ページがファイルをロードし、コンテンツ ストリームにプッシュします。

これは、多くのファイル ダウンロード サイトが使用している動作と同じです。唯一の問題は、隠しフレームがリクエストの実行に失敗した場合 (javascript がオフになっている場合)、自動リクエストが失敗した場合に多くの同じサイトでリンクが利用可能になる理由です。

欠点: ファイルのクリーンアップ。

于 2012-06-06T21:16:28.233 に答える
0

とにかくリダイレ​​クトしているので、削除しcontext.Response.End();てください...

問題は、ここでのロジックの欠陥です....なぜあなたは応答を終了しますか?

PDF を取得してそのリンクを表示するか、META更新を使用して PDF の場所にリダイレクトするか、リンクを表示するか、両方の手法を組み合わせて使用​​することもできます。

于 2012-06-05T16:37:42.273 に答える