ASP.NET 4.5 から導入された ASP.NET Web API を使用してみました。下記に参考にしたURLを記載しておきます。
Learn About ASP.NET Web API
http://www.asp.net/web-api
Creating a Web API that Supports CRUD Operations
http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operations
検証環境
- ASP.NET 4.5 Visual Studio 2012
- Windows Server 2012
1. ソリューションの作成
下図のようにASP.NET MVC 4 Web アプリケーションプロジェクトテンプレートを使用してプロジェクトを作成します。本記事ではWebApi という名前でプロジェクトを作成したものとします。

MVC 4 プロジェクトテンプレート選択画面で Web API を選択します。 OK ボタンをクリックします。

ソリューションエクスプローラーで Controllers フォルダーを展開すると下図のように既定では ValueControllers.cs という API コントローラークラスが作成されます。今回はゼロから作成していきたいので ValuesController.cs は削除します。

2. API Controller クラスの実装
Web API 用のコントローラークラスを作成していきます。 Controllers フォルダーを右クリック→追加→コントローラー をクリックします。

下図のようなコントローラーの追加ダイアログが表示されます。コントローラー名を本例では下図のように UserControllerとしました。テンプレートに 空の API コントローラー を選択します。追加ボタンをクリックして API コントローラークラスを作成します。

Entity Framework を使用する場合は、 テンプレートで Entity Framework を使用した、読み取り/書き込み操作のある API コントローラーを選択してAPIコントローラーのひな形を作成することもできます。
今回は次のようなAPIコントローラークラスを作成してみました。TestUserは適当に作成したモデルクラスになります。Web API は メソッドの名前規約により、GETで始まるメソッドは HTTPの GET メソッドに対応します。同じように PUT, POST, DELETE で始まるメソッドはHTTPの PUT, POST, DELETE リクエストにマップされます。引数のない GetXXX メソッドが /api/user/ のように id の指定なしで呼び出されたときに使用されるメソッドになります。そのため、 /api/user/ のようなパスでリクエストされた場合、GetUsers メソッドが呼び出されるようになります。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebApi.Models;
namespace WebApi.Controllers
{
/// <summary>
/// WebApiのユーザーコントローラ
/// WebApiの使い方は http://www.asp.net/web-api が参考になります。
/// WebApiコントローラーの作り方は以下のURLなどのチュートリアルが参考になります。
/// http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operations
/// </summary>
public class UserController : ApiController
{
private IList<TestUser> Users = TestUser.GenerateDemoUsers();
/// <summary>
/// パラメータのない GET メソッドに対応するメソッド
/// 例:GET /api/user/
/// </summary>
/// <returns></returns>
public IEnumerable<TestUser> GetUsers()
{
return Users;
}
/// <summary>
/// id パラメータのある GETメソッドに対応するメソッド
/// 例:/api/user/1
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public TestUser GetUser(int id)
{
TestUser u = Users.FirstOrDefault(x => x.ID == id);
if (u == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return u;
}
/// <summary>
/// name パラメータのある GETメソッドに対応するメソッド
/// 例:GET /user/?name=Test
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public TestUser GetUserByName(string name)
{
TestUser u = Users.FirstOrDefault(x => x.Name.StartsWith(name, StringComparison.InvariantCultureIgnoreCase));
if (u == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return u;
}
/// <summary>
/// POSTメソッドに対応するメソッド。モデルを作成します。
/// 例:POST /api/user/
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public HttpResponseMessage PostProduct(TestUser user)
{
if (ModelState.IsValid)
{
user.ID = this.Users.Max(x => x.ID) + 1;
this.Users.Add(user);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = user.ID }));
return response;
}
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
/// <summary>
/// PUTメソッドに対応するメソッド。モデルを更新します。
/// 例:PUT /api/user/1
/// </summary>
/// <param name="id"></param>
/// <param name="user"></param>
/// <returns></returns>
public HttpResponseMessage PutUser(int id, TestUser user)
{
if (ModelState.IsValid && id == user.ID)
{
// update
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
/// <summary>
/// DELETEメソッドに対応するメソッド。モデルを削除します。
/// DELETE /api/user/1
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public HttpResponseMessage DeleteUser(int id)
{
TestUser u = Users.FirstOrDefault(x => x.ID == id);
if (u == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
// Remove 処理
return Request.CreateResponse(HttpStatusCode.OK, u);
}
}
}
参考までにTestUserモデルクラスのソースも記載しておきます。
変更を保存しビルドを行ってエラーが発生しないことを確認してください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace WebApi.Models
{
public class TestUser
{
public int ID { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Telephone { get; set; }
public static IList<TestUser> GenerateDemoUsers()
{
List<TestUser> users = new List<TestUser>();
users.Add(new TestUser
{
ID = 1,
Name = "Test Taro",
Email = "test.taro@sample.jp",
Telephone = "08111222333"
});
users.Add(new TestUser
{
ID = 2,
Name = "Test Hanako",
Email = "test.hanako@sample.jp",
Telephone = "08111222334"
});
users.Add(new TestUser
{
ID = 3,
Name = "Nihon Ichiro",
Email = "nihon.ichiro@sample.jp",
Telephone = "08111222335"
});
users.Add(new TestUser
{
ID = 4,
Name = "Nihon Hanako",
Email = "nihon.hanako@sample.jp",
Telephone = "08111222336"
});
return users;
}
}
}
/api/<コントローラー>/ とぃうパスへのリクエストが発生したときに Web API 用のコントローラーに処理がルーティングされるのは、以下のように /api/コントローラー/id というWebApi用のルーティングの設定が Global.asax から呼び出されるApp_Start/WebApiConfig.cs で設定されているためです。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
2.動作確認
F5キーを入力してプロジェクトをデバッグ実行します。起動したブラウザーで下図のように /api/user/ というパスを入力してEnterキーを入力します。

UserController の 引数のない GetUsers メソッドが呼び出され TestUser の一覧がjson形式でダウンロードされます。

実際にファイルの中身を確認すると 下図のように JSON形式の文字列になっていることが確認できます。

下図のように name=Test というクエリパラメーターをしていすると name というパラメーターに一致するシグネチャをもつ GetUserByName というメソッドが呼び出さるようになります。このとき nameという名前の引数に Test という文字列がApiController により自動的に 割り当てられます。

3.まとめ
説明は以上です。Web API を使用すると サーバーと連携する AJAX アプリケーションを簡単に作成できるようになることがわかります。