7

ASP.NET Web API のいくつかの拡張ポイントを扱うときは、TAP (タスクベースのプログラミング パターン) も扱います。いくつかの時点で、非同期メソッドに継続を提供したい場合がContinueWithあり、 に渡すデリゲート内でいくつかの処理を行いますContinueWith

Brad Wilson がここで詳細に説明したように、継続を提供する場合は SynchronizationContext が不可欠です。私にとって、ASP.NET Web API に戻る必要がある唯一SynchronizationContextの場所は、遊ぶ必要がある場所HttpContext.Current(ASP.NET Web API アプリケーションでは絶対にやらないことです) とその場所です。などのスレッドベースの情報を設定する必要がありますThread.CurrentPrincipal

SynchronizationContext問題は、メッセージ ハンドラー、フィルター、フォーマッターなどの一部の拡張ポイントで継続を提供するときに、元に戻りたいと思うことはありますか?

4

1 に答える 1

2

ほとんどの場合、答えはyesです。

常に同期コンテキストを使用するSynchronizationContextというわけではありませんが、メッセージ ハンドラー、フィルター、およびフォーマッターの性質を考えると、それらがにアクセスするために を使用する必要があるかどうかを予測することはできません。HttpContextBase.

にアクセスできるようにする何かが渡されるフィルターを使用してもHttpContext(たとえば、IActionFilterimplementationを介して)、HttpContext最終的CallContextにはスレッドの現在を調べて、そのインスタンスからの情報を提供します。現在のスレッド (非同期実行時) は、 を開始したときにその情報を持っていないためTask、これらの呼び出しは失敗します。

HttpContextBaseとはいえ、リクエストに関連付けられた一般的な自由なアクセスが必要な場合は、アクセスするために絶対に を渡す必要がありSynchronizationContextます。

ただし、可能であれば、必要な から詳細をコピーしそれHttpContextBaseを渡す必要があります。非常に一般化されたものを書いている場合、これは不可能です。

于 2012-10-22T21:04:51.953 に答える