iPX社員によるブログ

iPX社員が"社の動向"から"自身の知見や趣味"、"セミナーなどのおすすめ情報"に至るまで幅広い話題を投下していくブログ。社の雰囲気を感じ取っていただけたら幸いです。

WebAPIのセルフホスト

自己紹介

4回目の記事を担当します、iPX の深津です。
本来でしたら先週の土曜日に更新するはずでしたが、遅くなってしまいました。
申し訳ありません。

現在は某社の情シスに常駐し、社内システムの作成などの業務に従事しています。
主要な使用言語は C#。主戦場は ASP.NET MVC 方面でしょうか。
本来の専門は AutoCAD のカスタマイズだったんですが。

WebAPI のセルフホスト

ASP.NET を元にしたフレームワークの一つに、 ASP.NET WebAPI があります。
これを使うと、RESTful な Web API をさっくり作ることができます。あら、便利。
実行するには Web サーバーが必要になりますが、単発のシステムのためにわざわざ IIS の設定をするのもなぁ……という局面が発生することもあります。
そんなときに便利なのが「セルフホスト」です。
コンソールアプリケーションを一つ立ち上げっぱなしにするだけで、 WebAPI アプリケーションを公開できてしまいます。あら、便利。

現在最新の ASP.NET WebAPI 2.2 でしたら OWIN 規格に対応していますので、これを使ってセルフホストアプリケーションを作ってみましょう。
なお個人的な理由により、環境は Windows7 64bit + VisualStudio2012 Professional とします。

手順

  1. VS2012 を立ち上げ、 "ASP.NET MVC 4 Web アプリケーション" プロジェクトを作成します。「プロジェクト テンプレート」では "Web API" を選択してください。
  2. WebAPI プロジェクトの "参照設定" を右クリックし、 [NuGet パッケージの管理] を選択します。次に [インストール済のパッケージ] から "Microsoft.NET Framework4 HTTP Client Libraries 日本語 リソース(識別:Microsoft.Http.ja)" をアンインストールしましょう。これをアンインストールしておかないと、次のステップで失敗します。
  3. [更新プログラム]-[すべて] を開き、 [すべて更新] ボタンを押してください。これで WebAPI フレームワークが 2.2 にアップデートされます。
  4. テストプロジェクトを作成している場合は、そちらも同様にして NuGET パッケージを更新しましょう。その後ソリューション全体をリビルドし、ビルドが通ればOKです。
  5. ソリューションに新しいコンソールアプリケーションプロジェクトを追加します。手順の詳細は割愛。このプロジェクトがセルフホストアプリケーションになります。
  6. コンソールアプリケーションプロジェクトの [参照設定]⇒[NuGet パッケージの管理] を開き、[オンライン] を選択して "SelfHost" で検索してください。"Microsoft ASP.NET Web API 2.2 OWIN Self Host(識別:Microsoft.AspNet.WebApi.OwinSelfHost)" がありますので、これをインストールします。 "OWIN" が無いパッケージもありますが、こちらをインストールしないように注意してください。
  7. コンソールアプリケーションプロジェクトの Program.cs を開き、下記のように修正します。
  8. ソリューションをビルドし、コンソールアプリケーションを起動します。次に Web ブラウザを立ち上げて "http://localhost:8080/api/Values/" にアクセスしてみてください。値を取得することができれば成功です。

Program.cs

using System;
using System.Web.Http;
using Microsoft.Owin.Hosting;
using MvcApplication2;
using Owin;

namespace ConsoleApplication1
{
class Program
{
static void Main( string[] args )
{
string base_address = "http://localhost:8080/";

using( var app = WebApp.Start<startup>( base_address ) )
{
Console.WriteLine( "start:{0}", base_address );
Console.ReadKey();
}
}
}

public class Startup
{
public void Configuration( IAppBuilder appBuilder )
{
var config = new HttpConfiguration();
WebApiConfig.Register( config );

appBuilder.UseWebApi( config );
}
}
}

参考文献