2

Rackspace に計算を行う Web サイトがありますが、計算には 30 秒から数分かかります。もともとこれを SignalR で実装しましたが、CC の使用が多すぎるため、ヤンクする必要がありました。Hosted Rackspace サイトは、実際にはそのような用途向けには設計されていません。法案は屋根を突き破った。

基本的なコードは以下のとおりで、私のテスト サーバーでは完全に動作しますが、ウォッチャーが計算を強制終了したために計算に 30 秒以上かかると、もちろん Rackspace でタイムアウト エラーが発生します。(古いコード) ストリームを存続させるには、操作でストリームに書き込む必要があると言われました。昔は、スレッドを開始し、スレッドが終了するまでサイトをポーリングしていました。より良い方法があれば、私はそれを取ることを好みます。

.NET 4.5 では、HttpTaskAsyncHandler を使用してこれを実現できるようです。しかし、私はそれを取得していません。以下の (新しいコード) は、使用中の古いコードを取り、それを ProcessRequestAsync タスクに配置することによって使用するハンドラーを理解しているとおりです。CalcHandler / Calc を呼び出そうとすると、ルーティングに関係している可能性が高い 404 エラーが発生します。このリンクをたどろうとしましたが、動作させることもできませんでした。追加名は「myHandler」ですが、リンクの例は「feed」です。彼らは、クラス ライブラリを作成したと述べましたが、コードを現在のコードと同じプロジェクトに含めることはできますか?

http://codewala.net/2012/04/30/asynchronous-httphandlers-with-asp-net-4-5/

補足として、HttpTaskAsyncHandler を使用すると、数分かかる場合、完了するまで要求を存続させることができますか? 基本的に、私が達成しようとしていることに何か他のものを使用する必要があります。

古いコード

[Authorize]
[AsyncTimeout(5000)] // does not do anything on RackSpace
public async Task<JsonResult> Calculate(DataModel data)
{
   try
   {
        using (var db = new ApplicationDbContext())
        {
           var result = await CalcualteResult(data);
           return Json(result, JsonRequestBehavior.AllowGet);
        }
   }
   catch (Exception ex)
   {
      LcDataLink.ProcessError(ex);
   }

   return Json(null, JsonRequestBehavior.AllowGet);
}

新しいコード

public class CalcHandler : HttpTaskAsyncHandler
{
    public override System.Threading.Tasks.Task ProcessRequestAsync(HttpContext context)
    {
        Console.WriteLine("test");
        return new Task(() => System.Threading.Thread.Sleep(5000));
    }
  }
4

1 に答える 1

0

これは最善の方法ではありません。通常、別のプロセス (Azure では "worker ロール") を作成する必要があります。

このプロセスは長時間の操作を処理し、結果をデータベースに保存します。SignalR を使用して (または 20 秒ごとに api メソッドを呼び出して)、クライアント側 (ブラウザー) でこの操作のステータスを更新します。

このプロセスの計算に時間がかかりすぎると、サーバーが DDoS 攻撃に対して脆弱になる可能性があります。

さらに、構成にもよりますが、長時間実行される操作はサーバー自体によって強制終了される可能性があります。デフォルトでは、私が間違っていなければ、実行の 30 分後です。

于 2015-03-01T02:33:12.443 に答える