サーチ…


asp.net webapiでのルーティングのしくみ

ASP.NET Web APIでは、コントローラはHTTP要求を処理するクラスです。コントローラの公開メソッドは、アクションメソッドまたは単にアクションと呼ばれます。

Web APIフレームワークは要求を受け取ると、その要求をアクションにルーティングします。呼び出すアクションを決定するために、フレームワークはルーティングテーブルを使用します。 Web API用のVisual Studioプロジェクトテンプレートは、既定のルートを作成します。

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "**api/{controller}/{id}**",
    defaults: new { id = RouteParameter.Optional }
);

このルートは、App_Startディレクトリに配置されているWebApiConfig.csファイルで定義されています。 ここに画像の説明を入力

ルーティングテーブルの各エントリにはルートテンプレートが含まれています。 Web APIのデフォルトルートテンプレートは " api / {controller} / {id} "です。このテンプレートでは、「 api 」はリテラルパスセグメントで、{ controller }と{ id }はプレースホルダ変数です。

Web APIフレームワークがHTTP要求を受け取ると、URIとルーティングテーブル内のルートテンプレートの1つを照合しようとします。一致するルートがない場合、クライアントは404エラーを受け取ります。

たとえば、次のURIはデフォルトルートと一致します。

  • / api / values
  • / api / values / 1

ただし、次のURIは " api "セグメントがないため一致しません。

  • /値/ 1

一致するルートが見つかると、Web APIはコントローラーとアクションを選択します。

  • コントローラを見つけるために、Web APIは{controller}変数の値に "Controller"を追加します。
  • アクションを見つけるために、Web APIはHTTPメソッドを調べ、そのHTTPメソッド名で始まる名前のアクションを探します。たとえば、GETリクエストを使用すると、Web APIは「GetEmployee」や「GetAllEmployees」などの「Get ...」で始まるアクションを探します。この規則は、GET、POST、PUT、およびDELETEメソッドにのみ適用されます。

他のHTTPメソッドを有効にするには、コントローラの属性を使用します。後でその例を見ていきます。

  • {id}のようなルートテンプレートの他のプレースホルダ変数は、アクションパラメータにマップされます。

HTTPメソッドHTTPメソッドの命名規則を使用する代わりに、アクションメソッドをHttpGet、HttpPut、HttpPost、またはHttpDelete属性で修飾することで、アクションのHTTPメソッドを明示的に指定できます。

次の例では、EmployeeGetEmployeeメソッドがGET要求にマップされています。

 public class EmployeesController : ApiController
    {
        [HttpGet]
        public EmployeeGetEmployee(id) {}
    }   

アクションに対して複数のHTTPメソッドを許可したり、GET、PUT、POST、およびDELETE以外のHTTPメソッドを許可するには、HTTPメソッドのリストを取るAcceptVerbs属性を使用します。

public class EmployeesController: ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Employee GetEmployee (id) { }
}

アクション名によるルーティング

デフォルトのルーティングテンプレートでは、Web APIはHTTPメソッドを使用してアクションを選択します。ただし、アクション名がURIに含まれるルートを作成することもできます。

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

このルートテンプレートでは、{action}パラメータはコントローラ上のアクションメソッドの名前を指定します。このルーティングスタイルでは、属性を使用して許可されたHTTPメソッドを指定します。たとえば、コントローラに次のメソッドがあるとします。

public class EmployeesController: ApiController
{
    [HttpGet]
    public List<Employee> GetAllEmployees();
}

この場合、「 api / Employees / GetAllEmployees 」のGETリクエストはGetAllEmployeesメソッドにマップされます。

ActionName属性を使用してアクション名を上書きできます。次の例では、「 api / Employees / ShowAllEmployees / id 」にマップされる2つのアクションがあります.1つはGETをサポートし、もう1つはPOSTをサポートしています:

public class EmployeesController : ApiController
{
    [HttpGet]
    [ActionName("ShowAllEmployees")]
    public List<Employee> GetAll(int id);

    [HttpPost]
    [ActionName("ShowAllEmployees")]
    public void GetAll (int id);

}

非アクション

NonAction属性を使用することで、メソッドがアクションとして呼び出されるのを防ぐことができます。これは、たとえそれがそうでなければルーティングルールにマッチするとしても、メソッドがアクションではないことをフレームワークに通知します。

 [NonAction]  
public string GetValues() { ... }

動詞ベースのルーティングの例。

異なるhttpメソッドに対する同じUR1は、異なる動作をします。以下は同じものを示す表です。

HTTP VERB URL DESCRIPTION
取得する / api / students すべての生徒を返す
取得する / api / students / 5 学生ID = 5の詳細を返します。
役職 / api / students 新しい学生を追加する
プット / api / students / 5 ID = 5の学生を更新する
削除 / api / students / 5 Id = 5の学生を削除する


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow