2

わかった、

ここに MVC 4 アプリケーションがあり、その中で非同期 ActionResult を作成しようとしています。

目的 : ユーザーが Web ページにダウンロード PDF アイコンを持っていて、ダウンロードに時間がかかる。そのため、サーバーが PDF の生成でビジー状態である間、ユーザーは Web ページでいくつかのアクションを実行できます。

(「PDFのダウンロード」リンクをクリックすると、サーバーにajaxリクエストが送信され、サーバーはデータを取得してPDFをプッシュバックしています)

何が起こっているのかというと、ajax を呼び出して PDF をダウンロードしている間、プロセスが開始されますが、ブラウザーに戻らない限り、すべての要求がブロックされます。それは単純なブロック リクエストです。

これまでに試したこと。

1) AsyncController をコントローラーの基本クラスとして使用しました。

2) ActionResult を非同期タスク DownloadPDF() にしました。ここでは、PDF を生成するコード/ロジック全体をラッパーにラップしました。このラッパーは、最終的には DownloadPDF() 内で待機できるものになります。

このようなもの。

public async Task<ActionResult> DownloadPDF()
{
    string filepath = await CreatePDF();
    //create a file stream and return it as ActionResult
}

private async Task<string> CreatePDF()
{
    // creates the PDF and returns the path as a string
    return filePath;
}

はい、オペレーションはセッションベースです。

どこかで何かが欠けていますか?

4

1 に答える 1

4

目的 : ユーザーが Web ページにダウンロード PDF アイコンを持っていて、ダウンロードに時間がかかる。そのため、サーバーが PDF の生成でビジー状態である間、ユーザーは Web ページでいくつかのアクションを実行できます。

asyncこれはしません。MSDN の記事で説明しているようにasync、 はクライアント ブラウザーではなく、ASP.NET ランタイムに依存します。これは理にかなっています。asyncHTTP プロトコルを変更することはできません(ブログで言及しているように)。

ただし、これasyncはできませんが、AJAX ではできます。

何が起こっているのかというと、ajax を呼び出して PDF をダウンロードしている間、プロセスが開始されますが、ブラウザーに戻らない限り、すべての要求がブロックされます。それは単純なブロック リクエストです。

私の知る限り、投稿したリクエスト コードは完全に非同期です。PDF の作成中にスレッドを ASP.NET スレッド プールに戻しています。ただし、同時リクエストには他にもいくつかの側面があります。特に、よくあるハングアップの 1 つは、既定では ASP.NET セッション状態を複数の要求間で共有できないことです。

1) コントローラーの基本クラスとして AsyncController を使用しました。

これは不要です。最新のコントローラーは、アクションの戻り値の型を調べて、非同期かどうかを判断します。

はい、オペレーションはセッションベースです。

ASP.NET セッションがリクエストを制限しているように思えます。同時リクエストとセッション状態を参照してください。同じセッション内で同時リクエストを行うには、オフにするか、読み取り専用にする必要があります。

于 2015-03-04T19:56:46.543 に答える