rksoftware

Visual Studio とか C# とかが好きです

APS.NET MVC に API などを追加する

APS.NET MVC に API などを追加する方法です。API などとぼかしていますが、実際には API と WebForm ページです。

■ 概要

MVC と API を WebForm は一つのプロジェクトに共存できます。ASP.NET MVC のテンプレートでプロジェクトを作った場合でも、API の設定と Apiコントローラ、WebForm ページを追加すればそれぞれ普通に動きます。

■ Api の追加

  • プロジェクトに WebApiConfig クラスを追加します。
    App_Start フォルダに API 用のルート設定クラスを追加します。
using System.Web.Http;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            config.MapHttpAttributeRoutes();

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

基本的に Api のプロジェクトテンプレートで生まれるソースをそのまま持ってきただけです。
※注意 クラスの追加でソースファイルを追加すると namespace に App_Start が付きます。テンプレートで生まれる際にはつかないので、テンプレートに合わせて削除しておきましょう。

  • Global.asax.csWebApiConfig を使用するコードを追加します。

追加するコード

GlobalConfiguration.Configure(WebApiConfig.Register);

追加後のコード

using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace WebApplication4
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }
}
  • API コントローラを追加します。
    ソリューションエクスプローラー上のマウス右クリックから、APIコントローラーを追加します。
    次のような API コントローラクラスが作られます。
using System.Collections.Generic;
using System.Web.Http;

namespace WebApplication1.Controllers
{
    public class ValuesController : ApiController
    {
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        public string Get(int id)
        {
            return "value";
        }

        public void Post([FromBody]string value)
        {
        }

        public void Put(int id, [FromBody]string value)
        {
        }

        public void Delete(int id)
        {
        }
    }
}

これで http://localhost:XXXXX/Api/Valueshttp://localhost:XXXXX/Api/Values/5 などで追加した API を呼び出せます。

■ WebForm ページの追加

WebForm ページは API の追加よりさらに簡単です。

  • WebForm を追加します。
    ソリューションエクスプローラー上のマウス右クリックから、WebForm を追加します。
    WebForm1.aspx WebForm1.aspx.cs が作られます。

これで http://localhost:XXXXX/WebForm1.aspx で追加したページを表示できます。
※フォルダを作らずプロジェクトの階層に直接 WebForm を追加した場合。

■ 補足 Api のテンプレートからの変更点

実は、前述の API のコードはテンプレートで生まれるものに 1 行追加しています。
追加コード

config.Formatters.Remove(config.Formatters.XmlFormatter);

このコードを追加しておくと、API のレスポンスが常に JSON 形式になります。標準状態だと、クライアントからの要求に応じて XML か JSON かを自動で切り替えてレスポンスを作ってくれます。
しかしたいていの場合、実際に使うのは JSON だけでしょう。その場合、一思いに XML で返す設定を無効化するとブラウザなどで手軽に確認するときにも必ず JSON で返るので捗る場合もあると思います。