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