ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

ASP.NET vNext で Web API を試してみた

Visual Studio 14 CTP がリリースされたので、ASP.NET vNext で Web API を試してみました。

MVC と Web API が MVC 6 にマージされたので、Areas を利用して Web API のコントローラーをルーティングしてみます。GET のリクエストで、Person オブジェクトの JSON データを返すサンプルを作ります。

  • GET api/person/
  • GET api/staff/person/

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

MVC の依存関係を追加する

Visual Studio で新規プロジェクトを「ASP.NET vNext Empty Web Application」で作成します。project.json ファイルに、MVC の参照を追加します。インテリセンスが効くので、簡単に記述できます。

#project.json
{
    "dependencies": {
        "Helios" : "0.1-alpha-build-0585",
        "Microsoft.AspNet.Mvc": "0.1-alpha-build-1268"
    },
    "configurations" : {
        "net45" : { },
        "k10" : { }
    }
}

URL のルーティングを実装する

Startup クラスの Configure メソッドに、デフォルトと Area の 2 つの URL のルーティングを実装します。

#Startup.cs
using System;
using Microsoft.AspNet.Builder;
using Microsoft.Framework.DependencyInjection;
using Microsoft.AspNet.Routing;
 
namespace WebApplication5
{
    public class Startup
    {
        public void Configure(IBuilder app)
        {
            app.UseServices(services =>
            {
                services.AddMvc();
            });
 
            app.UseMvc(routes =>
            {
                routes.MapRoute("AreasApiRoute", "api/{area}/{controller}/{id?}");
                routes.MapRoute("ApiRoute", "api/{controller}/{id?}");
            });
        }
    }
}

モデルを実装する

Web API のレスポンスで返す Person クラスを実装します。

#Person.cs
using System;
 
namespace WebApplication5
{
    public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
}

コントローラーを実装する

異なる名前空間の PersonController クラスを実装します。2 つめのコントローラークラスに、[Area("Staff")] の属性を指定するところがポイントです。

#PersonController .cs
using Microsoft.AspNet.Mvc;
 
namespace WebApplication5.Controllers
{
    public class PersonController : Controller
    {
        public ActionResult Get()
        {
            var person = new Person { ID = 16, Name = "Aaron Ramsey" };
            return Json(person);
        }
    }
}
 
namespace WebApplication5.Staff.Controllers
{
    [Area("Staff")]
    public class PersonController : Controller
    {
        public ActionResult Get()
        {
            var person = new Person { ID = 99, Name = "Arsène Wenger" };
            return Json(person);
        }
    }
}

実行結果を確認すると、GET api/person/ は「Aaron Ramsey」、GET api/staff/person/ は「Arsène Wenger」のレスポンスが JSON で返ります。

まとめ

以前の記事に投稿したように、Attribute Routing を使っても、異なる名前空間の同名のコントローラーを定義できませんでした。MVCではできるのに・・・

gooner.hateblo.jp

今回、MVC と Web API がマージされたことで、MVC の Areas が使えるようになり、シンプルに実装できます。ASP.NET vNext は、もっと大きな話であり、これ以外にもいろいろと進化があって面白そうなので、少しずつ勉強していきたいと思います。