2016-03-21 14 views
0

経路の実行前に属性を介してAPI呼び出しを実行したい。カスタマーアクションフィルターを作成し、OnExecuting()オーバーライド関数を使用しました。.NET MVC経路前に属性内で非同期タスクを実行する

関数内では、別のサーバーへの非同期API呼び出しを待ちます。しかし、デバッグ中は、非同期呼び出しが完了する前にRouteが実行されていることがわかります。どうすればこれを達成できますか?

[CustomAttribute("Stuff")] 
    [Route("MyRoute")] 
    public async Task<IHttpActionResult> MyRoute() 
    { 
     await anotherAsyncFunction(); 
     return Ok(); 
    } 

カスタムアクションフィルタの定義。

public class CustomAttribute : ActionFilterAttribute 
{ 
    private string att; 
    public CustomAttribute(string a) 
    { 
     att = a; 
    } 


    public async override void OnActionExecuting(HttpActionContext actionContext) 
    { 


     await MyFirstAsyncFunction(); 


    } 
} 

残念ながら、これは残念ながらルートコードが実行される前に終了しません。

+1

Yikes。別のサービスに基づいて通話をブロックしていますか?私はこのルートを避け、それを待ち行列に入れ、代わりにフラグをチェックすることを提案するでしょう。あなたは滑りやすい斜面を向いています。 - コメントは別として、APIを同期して呼び出す必要があります。 –

+0

それはより同期化を待っていますか? – Tyler

+0

あなたは['AsyncHelper'](http://stackoverflow.com/a/25097498/298053)を見て、あなたの呼び出しをラッピングすることをお勧めします。 –

答えて

0

私は顧客アクションフィルタを作成し、OnExecuting()オーバーライド関数を使用しました。

コメント者が指摘したように、これはasync voidの使用によるものです。これは、呼び出し側が非同期操作の完了を待つ簡単な方法を提供しません。これは、私のasync best practices articleに「avoid async void」というアドバイスが含まれている理由の1つです。

ルート実行前に属性経由でAPIコールを実行したいと思います。

残念ながら、ASP.NET MVCは非同期フィルタをサポートしていません(ASP.NET Coreではうまく機能します)。 AFAIK、これを既存のASP.NET MVC製品に追加する計画はありません。オプションは、コードを手動で実行するか(属性を使用する代わりにアクション内で)、またはフィルタを同期させることです。

私はちょうどHttpResponseMessageレスポンス= client.PostAsJsonAsync( "/ api/rotue /"、res).Result;

これはsync-over-async anti-patternです。この場合、が発生し、が動作します。 HttpClient(これは非同期のみ)をWebClient(同期をサポート)に置き換える方が良いでしょう。

関連する問題