ASP.NET Web API の ルーティング

0 件のコメント

ASP.NET Web API における、ルーティング についてまとめます。 WCF と似ているけれど、バインド方法が若干異なるので、注意が必要そうです。

目次

参考までに…以下はルーティングに関連する別記事へのリンクです。

デフォルト設定 (デフォルト の ルーティング)

Web API も クライアント から サーバー に アクセス があると、ルートテーブル に設定された情報に従って実行する クラス 、関数 が選択されます。 この ルートテーブル への設定は、App_Start フォルダ 配下にある WebApiConfig.cs ファイル に記述されます。

// App_Start / WebApiConfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

デフォルト の ルーティング は api/{controller}/{id} なので、デフォルト の 呼び出し方 と 呼び出され方 の例は次のようになります。

クライアントからのリクエスト サーバーで実行される関数
メソッド URI コントローラー アクション 引数
例1 GET http://[サーバー名]/[アプリケーション名]/api/xxxx XxxxController クラス Get メソッド 引数なし
例2 GET http://[サーバー名]/[アプリケーション名]/api/xxxx/5 XxxxController クラス Get メソッド 5
例3 POST http://[サーバー名]/[アプリケーション名]/api/xxxx/5 XxxxController クラス Post メソッド 5

つまり、デフォルト設定では以下のような挙動になります。

  • リクエスト時 の大文字小文字は区別されない
  • 実行する コントローラー の アクション (メソッド) は、 リクエスト時 の メソッド名 で自動的に選択される

ルーティングテーブル追加による変更

App_Start フォルダ 配下にある WebApiConfig.cs ファイル に追記することで、新しい ルーティング を設定する方法です。 以下の サンプルコード では、WCF と同じように アクション を指定させる ルーティング を追加しています。

// App_Start / WebApiConfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

カスタム属性による変更

メソッド毎に属性(HttpGetHttpPostHttpPutHttpDelete 等)が存在するので、必要な メソッド に対応する属性を設定します。

namespace MvcApplication5.Controllers
{
    using System.Net;
    using System.Net.Http;
    using System.Web;
    using System.Web.Http;

    public class XxxxController : ApiController
    {
        [HttpPost]
        public HttpResponseMessage CreateNewProduct([FromBody] product)
        {
            // POST で呼び出される
        }
    }
}

今回、以下のサイトを参考にしました。