次の ASP.NET Web API 委任ハンドラーを検討してください。
public class MyHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var guid = Guid.NewGuid();
HttpContext.Current.Items["foo"] = guid;
// An Async operation
var result = await base.SendAsync(request, cancellationToken);
//All code from this point is not gauranteed to run on the same thread that started the handler
var restoredGuid = (Guid)HttpContext.Current.Items["foo"];
//Is this gauranteed to be true
var areTheSame = guid == restoredGuid;
return result;
}
}
上記の例は委任ハンドラーにあります。私が修正しようとしているのと同じ問題が、コントローラー、ビジネス オブジェクトなどに適用されます。
私は最終的に、HTTP リクエストごとにさまざまなオブジェクト間で単純なメモリ内共有状態を提供しようとしています。
非同期操作中に理解しているように、最初に操作を実行していた ASP.NET スレッドはスレッド プールに返され、非同期操作が完了した後、別のスレッドを使用して要求を終了できます。
HttpContext.Current.Items
コレクションに影響はありますか?コレクションにあった項目はItems
、要求が再開されたときにそこにあることが保証されていますか?
私は
HttpContext.Current
、私が完全に同意する理由で、最近、より広いコミュニティによって使用がしばしば眉をひそめていることを認識しています.このデータをコレクションに保存することは、
Request.Items
この問題の解決には適していません。私の同僚は、設計上の決定が不十分なために静的を必要とするからです。
どうもありがとう