ASP.NET Web API 1 をセルフホストする (C#)
作成者: Mike Wasson
このチュートリアルでは、コンソール アプリケーション内で Web API をホストする方法について説明します。 ASP.NET Web API には IIS は必要ありません。 独自のホスト プロセスで Web API をセルフホストできます。
新しいアプリケーションでは、OWIN を使用して Web API をセルフホストする必要があります。 「OWIN を使用して ASP.NET Web API 2 をセルフホストする」を参照してください。
チュートリアルで使用するソフトウェアのバージョン
- Web API 1
- Visual Studio 2012
コンソール アプリケーション プロジェクトを作成する
Visual Studio を起動して、[スタート] ページから [新しいプロジェクト] をクリックします。 [ファイル] メニューの [新規作成] を選択し、[プロジェクト] を選択します。
[テンプレート] ウィンドウで、[インストールされているテンプレート] を選択し、[Visual C#] ノードを展開します。 [Visual C#] で [Windows] を選択します。 プロジェクト テンプレートの一覧で、[コンソール アプリケーション] を選択します。 プロジェクトに "SelfHost" という名前を付け、[OK] をクリックします。
ターゲット フレームワークを設定する (Visual Studio 2010)
Visual Studio 2010 を使用している場合は、ターゲット フレームワークを .NET Framework 4.0 に変更します。 (既定では、プロジェクト テンプレートは .Net Framework Client Profile をターゲットとしています。)
ソリューション エクスプローラーで、プロジェクトを右クリックして [プロパティ] を選択します。 [ターゲット フレームワーク] ドロップダウン リストで、ターゲット フレームワークを .NET Framework 4.0 に変更します。 変更を適用するプロンプトが表示されたら、[はい] をクリックします。
NuGet パッケージ マネージャーをインストールする
NuGet パッケージ マネージャーは、Web API アセンブリを ASP.NET 以外のプロジェクトに追加する最も簡単な方法です。
NuGet パッケージ マネージャーがインストールされているかどうかを確認するには、Visual Studio の [ツール] メニューをクリックします。 NuGet パッケージ マネージャーというメニュー項目が表示されている場合は、インストールされています。
NuGet パッケージ マネージャーをインストールするには、次の手順を実施します:
- Visual Studio を起動します。
- [ツール] メニューの [拡張機能と更新プログラム] を選択します。
- [拡張機能と更新プログラム] ダイアログで、[オンライン] を選択します。
- "NuGet パッケージ マネージャー" が表示されない場合は、検索ボックスに「NuGet パッケージ マネージャー」と入力します。
- NuGet パッケージ マネージャーを選択し、[ダウンロード] をクリックします。
- ダウンロードが完了すると、インストールを促すプロンプトが表示されます。
- インストールが完了すると、Visual Studio の再起動を促すプロンプトが表示される場合があります。
Web API NuGet パッケージを追加する
NuGet パッケージ マネージャーがインストールされたら、Web API セルフホスト パッケージをプロジェクトに追加します。
- [ツール] メニューの [NuGet パッケージ マネージャー] を選択します。 注: このメニュー項目が表示されない場合は、NuGet パッケージ マネージャーが正しくインストールされていることを確認してください。
- [ソリューションの NuGet パッケージの管理] を選択します
- [NugGet パッケージの管理] ダイアログで、[オンライン] を選択します。
- 検索ボックスに「Microsoft.AspNet.WebApi.SelfHost」と入力します。
- ASP.NET Web API セルフホスト パッケージを選択し、[インストール] をクリックします。
- パッケージがインストールされたら、[閉じる] をクリックしてダイアログを閉じます。
Note
AspNetWebApi.SelfHost ではなく、Microsoft.AspNet.WebApi.SelfHost という名前のパッケージをインストールしてください。
モデルとコントローラーを作成する
このチュートリアルでは、「はじめに」チュートリアルと同じモデル クラスとコントローラー クラスを 使用します。
Product
という名前のパブリック クラスを追加します。
namespace SelfHost
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
}
ProductsController
という名前のパブリック クラスを追加します。 このクラスを System.Web.Http.ApiController から派生させます。
namespace SelfHost
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
public class ProductsController : ApiController
{
Product[] products = new Product[]
{
new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
};
public IEnumerable<Product> GetAllProducts()
{
return products;
}
public Product GetProductById(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return product;
}
public IEnumerable<Product> GetProductsByCategory(string category)
{
return products.Where(p => string.Equals(p.Category, category,
StringComparison.OrdinalIgnoreCase));
}
}
}
このコントローラーのコードの詳細については、「はじめに」チュートリアルを参照してください。 このコントローラーは、次の 3 つの GET アクションを定義します。
URI | 説明 |
---|---|
/api/products | すべての製品の一覧を取得します。 |
/api/products/id | ID で製品を取得します。 |
/api/products/?category=category | カテゴリ別の製品の一覧を取得します。 |
Web API をホストする
Program.cs ファイルを開き、次のステートメントを追加します。
using System.Web.Http;
using System.Web.Http.SelfHost;
Program クラスに次のコードを追加します。
var config = new HttpSelfHostConfiguration("http://localhost:8080");
config.Routes.MapHttpRoute(
"API Default", "api/{controller}/{id}",
new { id = RouteParameter.Optional });
using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
server.OpenAsync().Wait();
Console.WriteLine("Press Enter to quit.");
Console.ReadLine();
}
(省略可能) HTTP URL 名前空間の予約を追加する
このアプリケーションは http://localhost:8080/
をリッスンします。 既定では、特定の HTTP アドレスでリッスンするには管理者アクセス許可が必要です。 そのため、このチュートリアルを実行すると、次のエラーが表示されることがあります。"HTTP は URL http://+:8080/" を登録できませんでした。このエラーを回避するには、次の 2 つの方法があります。
- 昇格した管理者アクセス許可で Visual Studio を実行するか
- Netsh.exe を使用して、アカウントに URL を予約するアクセス許可を付与します。
Netsh.exe を使用するには、管理者アクセス許可でコマンド プロンプトを開き、次のコマンドを入力します。
netsh http add urlacl url=http://+:8080/ user=machine\username
ここで、machine\username はユーザー アカウントを指します。
セルフホスティングが完了したら、必ず予約を削除してください。
netsh http delete urlacl url=http://+:8080/
クライアント アプリケーションから Web API を呼び出す (C#)
Web API を呼び出すシンプルなコンソール アプリケーションを記述しましょう。
新しいコンソール アプリケーション プロジェクトを、ソリューションに追加します。
- ソリューション エクスプローラーで、ソリューションを右クリックし、[新しいプロジェクトの追加] を選択します。
- "ClientApp" という新しいコンソール アプリケーションを作成します。
NuGet パッケージ マネージャーを使用して、ASP.NET Web API Core ライブラリ パッケージを追加します。
- [ツール] メニューの [NuGet パッケージ マネージャー] を選択します。
- [ソリューションの NuGet パッケージの管理] を選択します
- [NuGet パッケージの管理] ダイアログで、[オンライン] を選択します。
- 検索ボックスに「Microsoft.AspNet.WebApi.Client」と入力します。
- Microsoft ASP.NET Web API クライアント ライブラリ パッケージを選択し、[インストール] をクリックします。
ClientApp の参照を SelfHost プロジェクトに追加します。
- ソリューション エクスプローラーで、ClientApp プロジェクトを右クリックします。
- 参照の追加を選択します。
- [参照マネージャー] ダイアログの [ソリューション] で [プロジェクト] を選択します。
- SelfHost プロジェクトを選択します。
- OK をクリックします。
Client/Program.cs ファイルを開きます。 次の using ステートメントを追加します。
using System.Net.Http;
静的 HttpClient インスタンスを追加します。
namespace Client
{
class Program
{
static HttpClient client = new HttpClient();
}
}
次のメソッドを追加して、すべての製品の一覧表示、ID 別の製品の一覧表示、カテゴリ別の製品の一覧表示を行います。
static void ListAllProducts()
{
HttpResponseMessage resp = client.GetAsync("api/products").Result;
resp.EnsureSuccessStatusCode();
var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
foreach (var p in products)
{
Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
}
}
static void ListProduct(int id)
{
var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;
resp.EnsureSuccessStatusCode();
var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
Console.WriteLine("ID {0}: {1}", id, product.Name);
}
static void ListProducts(string category)
{
Console.WriteLine("Products in '{0}':", category);
string query = string.Format("api/products?category={0}", category);
var resp = client.GetAsync(query).Result;
resp.EnsureSuccessStatusCode();
var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
foreach (var product in products)
{
Console.WriteLine(product.Name);
}
}
これらの各メソッドは、同じパターンに従います。
- HttpClient.GetAsync を呼び出して、GET 要求を適切な URI に送信します。
- HttpResponseMessage.EnsureSuccessStatusCode を呼び出します。 HTTP 応答の状態がエラー コードの場合、このメソッドは例外をスローします。
- ReadAsAsync<T> を呼び出して、HTTP 応答から CLR 型を逆シリアル化します。 このメソッドは、System.Net.Http.HttpContentExtensions で定義されている拡張メソッドです。
GetAsync メソッドと ReadAsAsync メソッドはどちらも非同期です。 これらのメソッドは、非同期操作を表す Task オブジェクトを返します。 Result プロパティを取得すると、操作が完了するまでスレッドがブロックされます。
非ブロッキング呼び出しを行う方法など、HttpClient の使用方法の詳細については、「.NET クライアントからの Web API の呼び出し」を参照してください。
これらのメソッドを呼び出す前に、HttpClient インスタンスの BaseAddress プロパティを "http://localhost:8080
" に設定します。 次に例を示します。
static void Main(string[] args)
{
client.BaseAddress = new Uri("http://localhost:8080");
ListAllProducts();
ListProduct(1);
ListProducts("toys");
Console.WriteLine("Press Enter to quit.");
Console.ReadLine();
}
設定すると、次のように出力されます。 (最初に SelfHost アプリケーションを実行することを忘れないでください。)
1 Tomato Soup 1.0 (Groceries)
2 Yo-yo 3.75 (Toys)
3 Hammer 16.99 (Hardware)
ID 1: Tomato Soup
Products in 'toys':
Yo-yo
Press Enter to quit.