読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ASP.NET 空の Web アプリケーションからWebAPIを使えるようにするための道のり「作成からヘルプページ、ODataのクエリの有効化まで」

ASP.NET C#

やってみましょう。デフォルトのWebAPIのだといっぱいなにかついてくるので。

プロジェクトの作成

ASP.NET 空の Web アプリケーションを作りましょう。それだけ。

必要な参照の追加

NuGetから参照を追加します。

  • Microsoft.AspNet.WebApi

この1つで芋づる式に必要なものがついてきます。
f:id:okazuki:20130823215140p:plain

Global.asaxを追加

グローバルアプリケーションクラスを追加します。
f:id:okazuki:20130823215309p:plain

App_Startというフォルダを作って、WebApiConfigクラスを作ってWebAPIの設定を行います。

using System.Web.Http;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration configuration)
        {
            configuration.Routes.MapHttpRoute(
                "DefaultApi",
                "api/{controller}/{id}",
                new { id = RouteParameter.Optional });
        }
    }
}

これをGlobal.asaxのApplication_Startから呼んでやります。

protected void Application_Start(object sender, EventArgs e)
{
    WebApiConfig.Register(GlobalConfiguration.Configuration);
}

動作確認

Controllersフォルダを作って、その中にWeb API コントローラー クラスを作ります。名前はとりあえずここではValuesControllerにしました。
f:id:okazuki:20130823220145p:plain

実行して、ブラウザが立ち上がるのでブラウザは無視してFiddlerあたりからhttp://localhost:ポート/api/valuesにアクセスしてみます。
f:id:okazuki:20130823220541p:plain

ちゃんと結果が返ってきます。
f:id:okazuki:20130823220638p:plain

ヘルプページの準備

ASP.NET WebAPIのヘルプページを準備してみます。以下のパッケージをnugetで追加します。

  • Microsoft.AspNet.WebApi.HelpPage

参照と、以下のようなファイル群が追加されます。こいつはASP.NET MVCで作られてるっぽいので、App_StartフォルダにRouteConfigというクラスを作って以下のような感じのコードを書きます。

using System.Web.Mvc;
using System.Web.Routing;

namespace WebApplication1
{
    public static class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            // axdは対象外らしい
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            // デフォルトのMVCのルートを定義
            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional });
        }
    }
}

Global.asaxのApplication_Startで上記のRegisterRoutesメソッドを呼び出します。それと同時にヘルプページはMVCのエリアの機能を使ってるので、それも有効にするためAreaRegistration.RegisterAllAreasメソッドを呼び出します。RouteConfigはWebApiのURLを横取りしないようにWebApiConfigより後に記述するのがポイント。

protected void Application_Start(object sender, EventArgs e)
{
    // MVCのエリアを登録する
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

実行して以下のURLにアクセスするとヘルプページが表示されます。ばっちり!
http://localhost:ポート/Help/
f:id:okazuki:20130823222244p:plain

ODataによるクエリを有効化する

最後にWebAPIに対してODataのクエリによるフィルタリングとかの機能を追加したいと思います。
nugetで以下のものを参照に追加します。

  • Microsoft.AspNet.WebApi.OData

参照を追加したらHttpConfigurationの拡張メソッドとしてODataのクエリを有効化するメソッドが追加されるので、それをWebApiConfigで呼び出します。

using System.Web.Http;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration configuration)
        {
            configuration.Routes.MapHttpRoute(
                "DefaultApi",
                "api/{controller}/{id}",
                new { id = RouteParameter.Optional });

            // ODataによるクエリをサポート
            configuration.EnableQuerySupport();
        }
    }
}

WebAPI自体をODataのクエリに対応させるには、さらにメソッドの戻り値をIEnumerableからIQueryableに変更しないといけません。ValuesControllerのGetメソッドの戻り値を以下のように変更します。

// GET api/<controller>
public IQueryable<string> Get()
{
    return new string[] { "value1", "value2" }.AsQueryable();
}

実行して動作を確認してみます。一件だけ結果を返すように?$top=1をつけてAPIを呼び出してみます。
f:id:okazuki:20130823223155p:plain

結果を見ると、ちゃんと最初の1件だけとれてることわかります。ばっちりですね。
f:id:okazuki:20130823223436p:plain

以上ゼロからWebAPIでODataのクエリが使えるようになるまでの手順でした。以外とめんどい。あとはフィルタの設定あたりを足せば普通のWebAPIのテンプレートと大体似たような雰囲気になるかも。