私はASP.NET 4.6をターゲットとしたASP.NETアプリケーションを持っていましたが、私の非同期MVCコントローラ内で初めてHttpContext.Current
がnullになる理由を突き止めようとしていますアクション。ASP.NET 4.6非同期コントローラメソッドがHttpContext.Currentを失うのを待ちました
自分のプロジェクトがv4.6をターゲットにしており、web.configのtargetFramework
属性も4.6であることを確認してトリプルチェックしました。
SynchronizationContext.Current
は、awaitの前後に割り当てられます。これは適切なものです。つまり、従来のものではなくAspNetSynchronizationContext
です。
FWIWは、外部I/Oバウンドコード(非同期データベースコール)を呼び出すが、AFAIUは問題ではないという事実のために、スレッドの継続を継続しています。
それでも! HttpContext.Current
がヌルになるという事実は、私のコードのためにいくつかの問題を引き起こし、私には意味をなさない。
私はthe usual recommendationsをチェックしました。私は肯定的です。私はすべきことすべてをやっています。私も絶対にConfigureAwait
が私のコードにありません!私は何をすべきか
は、私のHttpApplication
インスタンス上の非同期イベントハンドラのカップルです:
public MvcApplication()
{
var helper = new EventHandlerTaskAsyncHelper(Application_PreRequestHandlerExecuteAsync);
AddOnPreRequestHandlerExecuteAsync(helper.BeginEventHandler, helper.EndEventHandler);
helper = new EventHandlerTaskAsyncHelper(Application_PostRequestHandlerExecuteAsync);
AddOnPostRequestHandlerExecuteAsync(helper.BeginEventHandler, helper.EndEventHandler);
}
ため、私は非同期を必要とするカスタム認証&クリーンアップ・ロジック、これらの2が必要です。 AFAIU、これはサポートされており、問題ではありません。
他に、私が見ているこの困惑する行動の理由は他にありますか?
更新:追加の観察。
SynchronizationContext
は、待ってから待つ前と同じにとどまります。しかし、以下のスクリーンショットに見られるように、内部が変化しています! AWAIT、BEFORE
私は、これは、この時点で私の問題に関連するかもしれない方法(あるいはたとえ)わかりません。うまくいけば誰かがそれを見ることができます!
コントローラのアクションで 'ConfigureAwait(false)'を呼び出していますか? –
@Paulo:いいえ、私はそうではありません。 – aoven
@エルドー:そのポイントは何ですか?私は、内部(つまり、私が言及したDB呼び出し)が非同期であるため、コントローラのアクションで非同期が必要であり、非同期であることが必要です。非同期を削除すると、膨大な量のコードを無効にする必要があります。 – aoven