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] をクリックします。

Screenshot of the New Project dialog box showing the Visual C# item in the folder list and the Windows Forms Application item, which is highlighted in gray.

ターゲット フレームワークを設定する (Visual Studio 2010)

Visual Studio 2010 を使用している場合は、ターゲット フレームワークを .NET Framework 4.0 に変更します。 (既定では、プロジェクト テンプレートは .Net Framework Client Profile をターゲットとしています。)

ソリューション エクスプローラーで、プロジェクトを右クリックして [プロパティ] を選択します。 [ターゲット フレームワーク] ドロップダウン リストで、ターゲット フレームワークを .NET Framework 4.0 に変更します。 変更を適用するプロンプトが表示されたら、[はい] をクリックします。

Screenshot of the Solution Explorer window showing the Target Framework dropdown list with the dot NET Framework 4 item, which is highlighted in blue.

NuGet パッケージ マネージャーをインストールする

NuGet パッケージ マネージャーは、Web API アセンブリを ASP.NET 以外のプロジェクトに追加する最も簡単な方法です。

NuGet パッケージ マネージャーがインストールされているかどうかを確認するには、Visual Studio の [ツール] メニューをクリックします。 NuGet パッケージ マネージャーというメニュー項目が表示されている場合は、インストールされています。

NuGet パッケージ マネージャーをインストールするには、次の手順を実施します:

  1. Visual Studio を起動します。
  2. [ツール] メニューの [拡張機能と更新プログラム] を選択します。
  3. [拡張機能と更新プログラム] ダイアログで、[オンライン] を選択します。
  4. "NuGet パッケージ マネージャー" が表示されない場合は、検索ボックスに「NuGet パッケージ マネージャー」と入力します。
  5. NuGet パッケージ マネージャーを選択し、[ダウンロード] をクリックします。
  6. ダウンロードが完了すると、インストールを促すプロンプトが表示されます。
  7. インストールが完了すると、Visual Studio の再起動を促すプロンプトが表示される場合があります。

Screenshot of the Extensions and Updates dialog box showing NuGet Package Manager in the search results, which is highlighted in gray.

Web API NuGet パッケージを追加する

NuGet パッケージ マネージャーがインストールされたら、Web API セルフホスト パッケージをプロジェクトに追加します。

  1. [ツール] メニューの [NuGet パッケージ マネージャー] を選択します。 : このメニュー項目が表示されない場合は、NuGet パッケージ マネージャーが正しくインストールされていることを確認してください。
  2. [ソリューションの NuGet パッケージの管理] を選択します
  3. [NugGet パッケージの管理] ダイアログで、[オンライン] を選択します。
  4. 検索ボックスに「Microsoft.AspNet.WebApi.SelfHost」と入力します。
  5. ASP.NET Web API セルフホスト パッケージを選択し、[インストール] をクリックします。
  6. パッケージがインストールされたら、[閉じる] をクリックしてダイアログを閉じます。

Note

AspNetWebApi.SelfHost ではなく、Microsoft.AspNet.WebApi.SelfHost という名前のパッケージをインストールしてください。

Screenshot of the Manage NuGet Packages dialog box showing Microsoft A S P dot Net Web A P I Self Host, which is highlighted in blue.

モデルとコントローラーを作成する

このチュートリアルでは、「はじめに」チュートリアルと同じモデル クラスとコントローラー クラスを 使用します。

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" という新しいコンソール アプリケーションを作成します。

Screenshot of the Solution Explorer showing the right-click menu items Add and New Project, which is highlighted in white.

NuGet パッケージ マネージャーを使用して、ASP.NET Web API Core ライブラリ パッケージを追加します。

  • [ツール] メニューの [NuGet パッケージ マネージャー] を選択します。
  • [ソリューションの NuGet パッケージの管理] を選択します
  • [NuGet パッケージの管理] ダイアログで、[オンライン] を選択します。
  • 検索ボックスに「Microsoft.AspNet.WebApi.Client」と入力します。
  • Microsoft ASP.NET Web API クライアント ライブラリ パッケージを選択し、[インストール] をクリックします。

ClientApp の参照を SelfHost プロジェクトに追加します。

  • ソリューション エクスプローラーで、ClientApp プロジェクトを右クリックします。
  • 参照の追加を選択します。
  • [参照マネージャー] ダイアログの [ソリューション][プロジェクト] を選択します。
  • SelfHost プロジェクトを選択します。
  • OK をクリックします。

Screenshot of the Reference Manager dialog box showing the Self Host project, which is highlighted with a blue box.

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);
    }
}

これらの各メソッドは、同じパターンに従います。

  1. HttpClient.GetAsync を呼び出して、GET 要求を適切な URI に送信します。
  2. HttpResponseMessage.EnsureSuccessStatusCode を呼び出します。 HTTP 応答の状態がエラー コードの場合、このメソッドは例外をスローします。
  3. 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.

Screenshot of the console window showing an outputted list of products associated with I D and categories.