2016-06-22 3 views
0

私はASP.NET Web API 2のためにC#で書いています。私が望むのは、自分のWeb APIに付随するすべてのリクエストに対して実行されるキャッチオールメソッドです。ASP.NET Web API - ルーティングされたメソッドより前のすべての要求に対して呼び出されるメソッドですか?

このメソッドがnullを返す場合は、正しい方法を探して、元のルーティングを続行する必要があります。しかし、メソッドがHTTPResponseMessageを返す場合、サーバーはその応答を返し、通常のルーティングに進む必要はありません。

ユースケースは、API全体に影響を与えるさまざまなシナリオを処理する能力です。たとえば、特定のユーザーエージェントをブロック(またはホワイトリスト)する1つのIPアドレスを禁止し、APIコールのカウントを処理します(たとえば、の任意の APIメソッドに対してXリクエストをY分だけ行うことができます)。

今私が想像することができる唯一の方法は、文字通りAPIのために書いたすべての新しいメソッドにメソッド呼び出しを含めることです。たとえば、

[HttpGet] 
public HttpResponseMessage myNewMethod() 
{ 
    // I want to avoid having to do this in every single method. 
    var check = methodThatEitherReturnsResponseOrNull(Request); 
    if (check != null) return (HttpResponseMessage)check; 

    // The method returned null so we go ahead with normal processing. 
    ... 
} 

ルーティングでこれを達成する方法はありますか?

答えて

1

これは、アクションフィルタの対象です。これらは、グローバルに、クラス(コントローラ)、またはメソッド(アクション)レベルのいずれかに配置できる属性です。これらの属性は、アクションが実行される前にコードを実行したり、アクションの実行後にコードを実行したりする前処理を行うことができます。

前処理を使用している場合は、呼び出し元に結果を返すオプションがあり、メソッド(アクション)はまったく実行されません。

フィルタを登録するには、WebApiConfig.csファイルをグローバルに登録する必要があります。

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Filters.Add(new YourFilterAttribute()); // add record 
     // rest of code 
    } 
} 

System.Web.Http.Filters.ActionFilterAttributeから継承するカスタム属性を作成するか、インターフェイス System.Web.Http.Filters.IActionFilterを実装するかを具体的に許可/要求を拒否したい場合には、 IAuthorizationFilter/ AuthorizationFilterAttributeを実装することができます。

IPフィルタリングやカウント呼び出しなどの役割ごとに1つずつ、複数の属性を作成するようにも思えます。そのようにすると、1つの巨大な認証フィルタの代わりにモジュラ化されます。

多くのチュートリアルがthis oneは私のGoogle検索結果でランダムに選ばれました)のようにあります。私はあなたがそうしなかったのでコードを投稿するつもりはないので、私はあなたがしたいことを推測しています。

関連する問題