2009-03-05 16 views
2

これは複数の部分からなる質問です。ASP.NET HTTPHandlerと長時間実行するプロセス

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

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

質問2:最後のページが完了する前にXmlHttpRequestオブジェクトに返された処理中に、HTTPHandlerからデータを送信することはできますか?

私は実際の作業負荷を計算し、完了したパーセンテージを返したいと思います。私はこれが可能であると推測している。

ヒント?

EDIT:

簡単なテスト:

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(); 
     }    
    } 

がクライアントにビットによるHello Worldのビットをプッシュします。これは、synchroniousリクエストに応じて動作します...のXMLHttpRequestはreadystatechangeを取得する場合、私が表示されますイベントを各行に割り当てます。

私はいつもASP.NETアプリケーションのマルチスレッドを避けています。なぜなら、作業プロセスがいつ中断するのかを制御していないことです。その結果、生成されたすべてのスレッドが死んでしまいます。

代わりに、IISがこれを実行しているときに別のスレッドプールを再作成するのはなぜですか。

+0

スレッドプールを再発明する答え...長時間実行するプロセスの場合、スレッドプールを使用することはお勧めしません。 http://msdn.microsoft.com/en-us/magazine/cc164128.aspx – Keltex

答えて

1

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

ワーカープロセスがジョブのリサイクルを緩和したり、ジョブの状態を保存して再起動できるように、ジョブが重要であるかどうかを検討する際に問題があります。ジョブが非常に重要な場合は、ジョブを実行するWindowsサービスを作成し、Remotingなどを使用して進捗状況を照会する方がよいでしょう。

0
  1. あなたはweb.configファイル内の要求のタイムアウト値を変更することができ、気にいらないよう: <configuration> <system.web><httpRuntime executionTimeout="1000" /></system.web></configuration>

  2. することは私の知る限りでは、バック同じ非同期要求ダウン情報を送信する方法はありません。私が見たAjaxのほとんどのUIは、実行中のタスクの統計情報を保持する静的クラスを持つことでその動作を作成し、別の非同期リクエストまたはiframeでポーリングします。同様の例の良い例はNeat Upload Controlです。

0

は、ここに1つのアイデア...あなたが処理するために、「数分」かかるプロセスを持っている場合は

、あなたが別のスレッド(またはスレッドの別々のキュー)を作成するのではなく使用してオフ最高のかもしれないですASP.NETワーカースレッド。これは、すべてのワーカースレッドを使い切れば、Webサーバーがハングアップする可能性があるからです。この問題の詳細については、http://msdn.microsoft.com/en-us/magazine/cc164128.aspx

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

AJAXリクエスト(XmlHttpRequest)は、クライアント側でタイムアウトが発生しません(http://luke.breuer.com/tutorial/xmlhttprequest.aspx ...タイムアウトまでスクロールダウンします)。しかし、私は仕事をしてから数分すべての可能であれば:

+0

独立したスレッドは、依然としてワーカープロセス内に存在します。 –

+0

私が修正したタイプミス。 – Keltex

0

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

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

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. 
} 
だけで正常に動作し

+0

アプリケーションプールのリサイクルはこれに影響しませんか? – ChadT

関連する問題