33

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

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

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

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

これは、次を使用しているためだと思います。

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

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

4

3 に答える 3

42

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

今のところ、 でブロッキング コールを使用することをお勧めしますOnActionExecuting。願わくば、MVC が将来的により良いストーリーを持つことを願っています。

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

于 2012-09-18T18:22:30.853 に答える
1

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

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

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

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

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

于 2012-09-29T14:09:48.507 に答える