2

これは複数の部分からなる質問です。

完了するまでに数分かかる可能性のあるプロセスがあります。これは、非同期のjavascriptリクエストを使用してHTTPHandlerを呼び出すことによって実行されます。

質問1:このリクエストがサーバーとクライアントの両方でタイムアウトしないようにするにはどうすればよいですか?

質問2:最終ページが完了する前にXmlHttpRequestオブジェクトに返送される処理中に、HTTPHandlerからデータを出力することは可能ですか?

実際の作業負荷と完了した返品率を計算したいと思います。これは可能だと思います。

任意のヒント?

編集:

簡単なテスト:

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        for (int i = 0; i < 100; i++)
        {
            context.Response.Write("Hello World " + i + Environment.NewLine);
            System.Threading.Thread.Sleep(500);
            context.Response.Flush();
        }            
    }

HelloWorldを少しずつクライアントにプッシュします...これは同期リクエストで機能します。xmlHttpRequestが各行のreadystatechangeイベントを取得するかどうかを確認します。

ASP.NETアプリでのマルチスレッド化は常に避けています。これは、作業プロセスがいつ終了するかを制御できないため、生成されたすべてのスレッドが停止する結果になるためです。

代わりに、IISがすでにこれを行っているのに、なぜ別のスレッドプールを再発明するのか。

4

6 に答える 6

1

私が過去に行ったことは、新しいスレッドで長時間実行プロセスを開始し、完了率を示すプロセスクラスのプロパティを持っていることです。その後、ブラウザは、その%completeプロパティをポーリングするだけのHttpHandlerに対してAJAX呼び出しを行うことがよくあります。そうすれば、HttpHandlerはすぐに戻ります。

ワーカープロセスがジョブの途中でリサイクルするのを軽減したり、ジョブの状態を保存して再開できるようにするなど、ジョブが重要かどうかを検討する際に問題が発生する可能性があります。ジョブが非常に重要な場合は、ジョブを実行するWindowsサービスを作成し、Remotingなどを使用して進行状況を照会することをお勧めします。

于 2009-03-05T23:25:11.040 に答える
0
  1. web.configでリクエストのタイムアウト値を次のように変更できます。 <configuration> <system.web><httpRuntime executionTimeout="1000" /></system.web></configuration>

  2. 私の知る限り、同じ非同期リクエストで情報を送り返す方法はありません。私が見たほとんどのAjaxUIは、実行中のタスクの統計を保持する静的クラスを作成し、それを別の非同期リクエストまたはiframeでポーリングすることでその動作を作成します。同様の良い例は、NeatUploadControlです。

于 2009-03-05T23:25:55.547 に答える
0

ここに1つのアイデアがあります...

処理に「数分」かかるプロセスがある場合は、ASP.NETワーカースレッドを使用するのではなく、別のスレッド(またはスレッドの別のキュー)を作成することをお勧めします。これは、すべてのワーカースレッドを使い切ると、Webサーバーがハングする可能性があるためです。この問題の詳細については、http://msdn.microsoft.com/en-us/magazine/cc164128.aspxを参照してください。

最初のAJAXリクエストは、プロセスを起動することです。その後の呼び出しは、完了率を含むプロセスのステータスを取得することです。タイマーを使用してポーリングし(数秒ごと、または最も効果的と思われるもの)、すべてが完了するまで%を完了させます。

AJAXリクエスト(XmlHttpRequest)には、クライアント自体にタイムアウトがありません(http://luke.breuer.com/tutorial/xmlhttprequest.aspx ...タイムアウトまでスクロールダウンします)が、それは良いことではないと思います可能であれば、数分間それらをオフにして作業を行うことをお勧めします。

于 2009-03-05T23:26:25.700 に答える
0

その価値のために、

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";
    for (int i = 0; i < 100; i++)
    {
        context.Response.Write("Hello World " + i + Environment.NewLine);
        System.Threading.Thread.Sleep(500);
        context.Response.Flush();
    }            
}

そしてクライアント側では:

httpObject.onreadystatechange = function()
{
    // This is called whenever Flush() is called on the server.
    // when readyState = 4, everything is done, but I can check responseText at anytime.
}

うまく動作します。

于 2009-03-06T04:29:03.477 に答える
0

定義上、HTTP リクエストはステートレスです。他の人が指摘したように、IIS がいつプロセスをリサイクルするかを予測することはできません。

より良いアプローチは、実際の作業を行う Windows サービスを作成し、進行状況についてクエリを実行してクライアントに返す HTTPHandler またはページなどを作成することです。同じマシンにサービスをインストールしてから、ページ/ハンドラーとサービスの間で接続するパイプまたは任意のリモート チャネルを使用できます。

于 2009-03-06T00:40:33.307 に答える
-2

このWebサイトからソースファイルをダウンロードします

http://www.stonebroom.com/dafiles/6744-code.zip

URL〜/ loadpost/stagedloading.aspxを確認してください。

于 2009-03-05T23:26:36.637 に答える