ASP.NET Web API 2 の構成

このトピックでは、ASP.NET Web APIを構成する方法について説明します。

構成設定

Web API 構成設定は、 HttpConfiguration クラスで定義されます。

メンバー 説明
DependencyResolver コントローラーの依存関係の挿入を有効にします。 「Web API 依存関係リゾルバーの使用」を参照してください。
フィルター アクション フィルター。
フォーマッタ メディア型フォーマッタ
IncludeErrorDetailPolicy サーバーに、例外メッセージやスタック トレースなどのエラーの詳細を HTTP 応答メッセージに含めるかどうかを指定します。 IncludeErrorDetailPolicy を参照してください。
初期化 子 HttpConfiguration の最終的な初期化を実行する関数。
MessageHandlers HTTP メッセージ ハンドラー
ParameterBindingRules コントローラー アクションのバインド パラメーターに関する規則のコレクション。
Properties 汎用プロパティ バッグ。
Routes ルートのコレクション。 「ASP.NET Web APIでのルーティング」を参照してください。
サービス サービスのコレクション。 「サービス」を参照してください。

前提条件

Visual Studio 2017 Community、Professional、または Enterprise エディション。

ASP.NET ホスティングを使用した Web API の構成

ASP.NET アプリケーションで、Application_Start メソッドで GlobalConfiguration.Configure を呼び出して Web API を構成します。 Configure メソッドは、HttpConfiguration 型の単一パラメーターを持つデリゲートを受け取ります。 デリゲート内のすべての構成を実行します。

匿名デリゲートを使用する例を次に示します。

using System.Web.Http;
namespace WebApplication1
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(config =>
            {
                config.MapHttpAttributeRoutes();

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

Visual Studio 2017 では、[ 新しい ASP.NET プロジェクト] ダイアログで [Web API] を選択すると、"ASP.NET Web アプリケーション" プロジェクト テンプレートによって構成コードが自動的に設定されます。

[新しい A S P ドット NET プロジェクト] ダイアログのスクリーンショット。Web A P I チェックボックスがオンにされ、構成コードが自動的に設定されます。

プロジェクト テンプレートは、App_Start フォルダー内に WebApiConfig.cs という名前のファイルを作成します。 このコード ファイルは、Web API 構成コードを配置する必要があるデリゲートを定義します。

[アプリの開始] フォルダー内で、Web A P I Config ドット c が赤で囲まれた [ソリューション エクスプローラー] ダイアログのスクリーンショット。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // TODO: Add any additional configuration code.

            // Web API routes
            config.MapHttpAttributeRoutes();

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

プロジェクト テンプレートは、Application_Startからデリゲートを呼び出すコードも追加 します

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

OWIN Self-Hostingを使用した Web API の構成

OWIN を使用して自己ホストしている場合は、新しい HttpConfiguration インスタンスを作成します。 このインスタンスに対して任意の構成を実行し、そのインスタンスを Owin.UseWebApi 拡張メソッドに渡します。

public class Startup 
{ 
    public void Configuration(IAppBuilder appBuilder) 
    { 
        HttpConfiguration config = new HttpConfiguration(); 

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

        appBuilder.UseWebApi(config); 
    } 
}

OWIN を使用して 2 をSelf-Host ASP.NET Web APIする」のチュートリアルでは、完全な手順を示します。

グローバル Web API サービス

HttpConfiguration.Services コレクションには、コントローラーの選択やコンテンツ ネゴシエーションなど、さまざまなタスクを実行するために Web API が使用するグローバル サービスのセットが含まれています。

Note

Services コレクションは、サービス検出または依存関係の挿入のための汎用メカニズムではありません。 Web API フレームワークに認識されているサービスの種類のみが格納されます。

Services コレクションは、既定のサービス セットで初期化され、独自のカスタム実装を提供できます。 複数のインスタンスをサポートするサービスもあれば、インスタンスを 1 つだけ持つサービスもあります。 (ただし、コントローラー レベルでサービスを提供することもできます。「 コントローラーごとの構成」を参照してください。

Single-Instance サービス

サービス 説明
IActionValueBinder パラメーターのバインドを取得します。
IApiExplorer アプリケーションによって公開される API の説明を取得します。 「Web API のヘルプ ページを作成する」を参照してください。
IAssembliesResolver アプリケーションのアセンブリの一覧を取得します。 「ルーティングとアクションの選択」を参照してください
IBodyModelValidator メディア型フォーマッタによって要求本文から読み取られたモデルを検証します。
IContentNegotiator コンテンツ ネゴシエーションを実行します。
IDocumentationProvider API のドキュメントを提供します。 既定値は null です「Web API のヘルプ ページを作成する」を参照してください。
IHostBufferPolicySelector ホストが HTTP メッセージ エンティティの本文をバッファーに格納するかどうかを示します。
IHttpActionInvoker コントローラー アクションを呼び出します。 「ルーティングとアクションの選択」を参照してください
IHttpActionSelector コントローラー アクションを選択します。 「ルーティングとアクションの選択」を参照してください
IHttpControllerActivator コントローラーをアクティブにします。 「ルーティングとアクションの選択」を参照してください
IHttpControllerSelector コントローラーを選択します。 「ルーティングとアクションの選択」を参照してください
IHttpControllerTypeResolver アプリケーション内の Web API コントローラーの種類の一覧を提供します。 「ルーティングとアクションの選択」を参照してください
ITraceManager トレース フレームワークを初期化します。 「ASP.NET Web APIのトレース」を参照してください。
ITraceWriter トレース ライターを提供します。 既定値は "no-op" トレース ライターです。 「ASP.NET Web APIのトレース」を参照してください。
IModelValidatorCache モデル検証コントロールのキャッシュを提供します。

Multiple-Instance サービス

サービス 説明
IFilterProvider コントローラー アクションのフィルターの一覧を返します。
ModelBinderProvider 特定の型のモデル バインダーを返します。
ModelMetadataProvider モデルのメタデータを提供します。
ModelValidatorProvider モデルの検証コントロールを提供します。
ValueProviderFactory 値プロバイダーを作成します。 詳細については、Mike Stall のブログ記事「WebAPI でカスタム値プロバイダーを作成する方法」を参照してください。

マルチインスタンス サービスにカスタム実装を追加するには、Services コレクションで Add または Insert を呼び出します。

config.Services.Add(typeof(IFilterProvider), new MyFilterProvider());

単一インスタンス サービスをカスタム実装に置き換えるには、Services コレクションで Replace を呼び出します。

config.Services.Replace(typeof(ITraceWriter), new MyTraceWriter());

Per-Controller構成

コントローラーごとに次の設定をオーバーライドできます。

  • メディアタイプフォーマッタ
  • パラメーター バインド規則
  • サービス

これを行うには、 IControllerConfiguration インターフェイスを実装するカスタム属性を定義します。 次に、 属性をコントローラーに適用します。

次の例では、既定のメディア型フォーマッタをカスタム フォーマッタに置き換えます。

using System;
using System.Web.Http;
using System.Web.Http.Controllers;

namespace WebApplication1.Controllers
{

    public class UseMyFormatterAttribute : Attribute, IControllerConfiguration
    {
        public void Initialize(HttpControllerSettings settings,
            HttpControllerDescriptor descriptor)
        {
            // Clear the formatters list.
            settings.Formatters.Clear();

            // Add a custom media-type formatter.
            settings.Formatters.Add(new MyFormatter());
        }
    }

    [UseMyFormatter]
    public class ValuesController : ApiController
    {
        // Controller methods not shown...
    }
}

IControllerConfiguration.Initialize メソッドは、次の 2 つのパラメーターを受け取ります。

  • HttpControllerSettings オブジェクト
  • HttpControllerDescriptor オブジェクト

HttpControllerDescriptor にはコントローラーの説明が含まれています。この説明は、情報を得るために調べることができます (たとえば、2 つのコントローラーを区別するため)。

コントローラーを構成するには、 HttpControllerSettings オブジェクトを使用します。 このオブジェクトには、コントローラーごとにオーバーライドできる構成パラメーターのサブセットが含まれています。 既定でグローバル HttpConfiguration オブジェクトに変更しない設定。