web-dev-qa-db-ja.com

MVC4の非同期アクションフィルター

特定の条件で使用すると、現在の状態が有効であることを確認するためにWebサービス呼び出しを実行する必要があるアクションフィルターがあります。これは当初、async/awaitの理想的な候補のように見えましたが、問題が発生しました。

/ Test/FilteredActionへのリクエストを想定します

  • MyCustomActionFilterが実行を開始します
    • 最初の「待機」ステートメントに到達
  • TestController.FilteredActionが実行を開始します
  • MyCustomActionFilterが実行を再開します

従来、アクションフィルターは実行を再開し、コントローラーアクションの実行が開始される前に完了すると予想していましたが、これは発生しません。

今、これは私が使用しているためだと思います:

public class MyCustomActionFilter : ActionFilterAttribute 
{
    public override **async** void OnActionExecuting(FilterContext context) 
    {
        var foo = await WebServiceCall();
    }
}

だから私の質問は:MVC 4に組み込まれている非同期対応のアクションフィルタークラスがありますか、それともここでの呼び出しをブロックする必要がありますか?

32
Foritus

MVCにはasync互換のアクションフィルターがありません(ただし、 WebAPIには1つあります )。

今のところ、OnActionExecutingでブロッキング呼び出しを使用することをお勧めします。うまくいけば、MVCは将来より良いストーリーを持つでしょう。

更新:MVCチームがasyncフィルターを追加するために ここに投票 できます。

40
Stephen Cleary

いいえ、MVCの非同期フィルターはありませんが、実行可能です。

ASP.NET MVCフィルターは、順序付けの概念に依存しており、フィルターが保証されます(指定されている場合。 OrderインターフェイスIMvcFilterプロパティ を参照)。指定されています。

これに照らして対処しなければならない問題は次のとおりです。

  • 非同期ではない既存のフィルター(少なくとも実装されていない他の方法がないため)場合、それらは独自のタスクを取得しますか、それとも続行しますか?前回のもの?別のスレッドで次のフィルターを続行しないことの利点と、他の要求がそれを使用できる間そのスレッドを保持することの利点を比較検討する必要があるため、答えることは重要な質問です。

  • 同じ順序が指定されているフィルターの場合、それらは並行して実行されますか、それとも次々に実行されますか?メソッドを非同期にすると、この可能性がさらに広がり(以前は非同期シグニチャで実行できたとしても)、パフォーマンスと期待される結果に影響を与える可能性のあるアーキテクチャの変更が確実に発生します。ここでの答えはそれほど単純ではなく、テストと下位互換性に基づく必要があります。

1
casperOne