1

私は現在、サードパーティからいくつかのXMLデータのPOSTを取得し、それを使用していくつかの作業を行うHTTPハンドラーを実装しています。XMLで行う処理には、時間がかかる可能性があります。POSTからXMLをヤンクアウトしたら、データを処理している間、クライアントとの接続を開いたままにする必要はありません。クライアントがいつ投稿をタイムアウトするかを制御できないので、XMLを取得して接続を解除したいだけです。

これを行う簡単な方法はありますか?Response.Close()を使用すると、接続が適切に閉じられないため、正しくありません。Response.End()は、HTTPハンドラーをすべて一緒に終了します。処理をバックグラウンドスレッドにスローすることもできますが、AppDomainが破棄されて途中でプロセスが停止する可能性があるため、ASP.NETでは少し危険な場合があると聞きました。

どんな考えでも大歓迎です。助けてくれてありがとう!

4

3 に答える 3

2
  1. 受信したデータをある種の永続キュー(MSMQなど)に保存します。
  2. ハンドラーを終了します。
  3. Windowsサービスなど、別のアプリケーションのキューからのデータを処理します。

これは正確に「簡単な方法」ではありませんが、顧客にとって安全で迅速です。

于 2012-11-29T15:53:37.690 に答える
1

ご意見ありがとうございます。他の人が解決策としてそれを考えることができるように、私がこれについて行った方法:

キューイングはおそらく最も「正しい」手段ですが、私がやろうとしていることを実際に上回っている追加の実装が必要になります。http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspxからの情報を使用する

まず、処理クラスを作成し、それをバックグラウンドスレッドでスピンアップして、クライアントからXMLを取得した後に作業を行います。これにより、ワーカースレッドがバックグラウンドで継続している間に接続が解放されます。

処理クラスをとして登録しましたIRegisteredObjectStop(bool immediate)私はメソッドを実装しました

    public void Stop(bool immediate)
    {
        if (!immediate && _working)
            return;//don't unregister yet, give it some time

        if(immediate && _working)
        {
            //TODO: Log this instance
        }
        HostingEnvironment.UnregisterObject(this);
    }

作業を処理しているときに_working変数をtrueに設定し、完了したら設定を解除します。まれに、作業を処理していて、AppDomainが停止しているために停止が呼び出された場合、最初は登録を解除せずに戻ります。これにより、プロセスが完了するまでにもう少し時間がかかります。即時フラグがtrueに設定された状態でメソッドが2回呼び出された場合、問題はすぐにログに記録され、登録が解除されます。

これは最終的な解決策ではないかもしれませんが、私の目的では、非常にまれな状態が発生したときにアラートを出し、データを処理するときにクライアントの接続を保持しないようにします。

于 2012-11-29T19:08:32.363 に答える
0

.NET 4.5を使用している場合は、HttpTaskAsyncHandlerを確認してください。

リンク先のページから:

非同期HTTPハンドラーASP.NETで非同期ハンドラーを作成する従来のアプローチは、IHttpAsyncHandlerインターフェイスを実装することです。ASP.NET 4.5では、派生可能なHttpTaskAsyncHandler非同期基本型が導入されています。これにより、非同期ハンドラーの記述がはるかに簡単になります。HttpTaskAsyncHandlerタイプは抽象であり、ProcessRequestAsyncメソッドをオーバーライドする必要があります。内部的には、ASP.NETは、ProcessRequestAsyncの戻り署名(タスクオブジェクト)を、ASP.NETパイプラインで使用されている古い非同期プログラミングモデルと統合します。次の例は、非同期HTTPハンドラーの実装の一部としてTaskとawaitを使用する方法を示しています。

public class MyAsyncHandler : HttpTaskAsyncHandler 
{ 
        // ... 

        // ASP.NET automatically takes care of integrating the Task based override 
        // with the ASP.NET pipeline. 
        public override async Task ProcessRequestAsync(HttpContext context) 
        { 
           WebClient wc = new WebClient(); 
           var result = await  
                   wc.DownloadStringTaskAsync("http://www.microsoft.com"); 
           // Do something with the result 
        } 
}
于 2012-11-29T16:06:54.270 に答える