ASP.NET Web API 2.2 の新機能

提供元: Microsoft

このトピックでは、ASP.NET Web API 2.2 の新機能について説明します。

ダウンロード

ランタイム機能は、NuGet ギャラリーで NuGet パッケージとしてリリースされます。 ランタイム パッケージはすべてセマンティック バージョンの仕様に従います。 ASP.NET Web API 2.2 パッケージの最新バージョンは、"5.2.0" です。 これらのパッケージは、NuGet を使用してインストールまたは更新できます。 このリリースには、NuGet 上の対応するローカライズされたパッケージも含まれています。

リリース済みの NuGet パッケージは、NuGet パッケージ マネージャー コンソールを使用してインストールまたは更新できます。

Install-Package Microsoft.AspNet.WebApi -Version 5.2.0

ドキュメント

ASP.NET Web API 2.2 に関するチュートリアルとその他の情報は、ASP.NET Web サイト (https://www.asp.net/web-api) から入手できます。

ASP.NET Web API 2.2 の新機能

OData v4

このリリースでは、OData v4 プロトコルのサポートが追加されました。 詳細については、「Web API OData v4 のドキュメント」を参照してください。

OData v4 の主要な機能と変更点を次に示します。

属性ルーティングの機能強化

属性ルーティングで IDirectRouteProvider と呼ばれる拡張性ポイントが提供されるようになりました。これにより、属性ルートの検出と構成方法を完全に制御できます。 IDirectRouteProvider は、アクションとコントローラーの一覧と関連するルート情報を提供し、それらのアクションに必要なルーティング構成を正確に指定する役割を担います。 MapAttributes/MapHttpAttributeRoutes を呼び出すときに、IDirectRouteProvider の実装を指定できます。

IDirectRouteProvider をカスタマイズするには、既定の実装である DefaultDirectRouteProvider を拡張するのが最も簡単です。 このクラスは、属性の検出、ルート エントリの作成、ルート プレフィックスとエリア プレフィックスの検出のロジックを変更するための、オーバーライド可能な仮想メソッドを個別に提供します。

この新しい拡張性ポイントで実行できる操作の例を次に示します。

  1. ルート属性の継承をサポート

    例:

    ここでは、"/api/values/10" のような要求で "Success:10" が正常に返されます

    public class BaseController : ApiController
    {
        [Route("{id:int}")]
        public string Get(int id)
        {
            return "Success:" + id;
        }
    }
    [RoutePrefix("api/values")]
    public class ValuesController : BaseController
    {
    }
           
    config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());
    public class CustomDirectRouteProvider : DefaultDirectRouteProvider
    {
        protected override IReadOnlyList<IDirectRouteFactory> 
        GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
        {
            return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
            (inherit: true);
        }
    }
    
  2. 必要な規則に従って、属性ルートに既定のルート名を指定します。 既定では、属性ルーティングは属性ルートの名前を自動的に作成しません。

  3. ルート テーブルに登録される前に、属性ルートのルート テンプレートを一元的に変更します。

Windows Phone 8.1 に対する Web API クライアントのサポート

これで、Windows Phone 8.1 をターゲットにするとき、または Universal App 内から Web API Client NuGet パッケージを使用して、Web API クライアント ロジックを実装できるようになりました。

既知の問題と重大な変更

このセクションでは、ASP.NET Web API 2.2 の既知の問題と重大な変更について説明します。

OData v4

モデル ビルダー

問題: オーバーロードされた関数を FunctionImport として公開できませんでした

オーバーロードされた関数が 2 つあり、その 2 つの関数が以下に示すように FunctionImport でもある場合、~/GetAllConventionCustomers(CustomerName={customerName}) を要求すると System.InvalidOperationException が発生します。

<Function Name="GetAllConventionCustomers" 
ReturnType="Collection(WebStack.QA.Test.OData.UnboundOperation.ConventionCustomer)" 
IsComposable="true" />
<Function Name="GetAllConventionCustomers" 
ReturnType="Collection(WebStack.QA.Test.OData.UnboundOperation.ConventionCustomer)" 
IsComposable="true">
<Parameter Name="CustomerName" Type="Edm.String" FixedLength="false" 
Unicode="false" />
</Function>
...
<FunctionImport Name="GetAllConventionCustomers" 
Function="WebStack.QA.Test.OData.UnboundOperation.GetAllConventionCustomers" 
EntitySet="ConventionCustomers" IncludeInServiceDocument="true" />

回避策: この問題の回避策は、両方の関数オーバーロードを FunctionImports として追加することです。

OData ルーティング

URL エンコードされたスラッシュ (%2F) と円記号 (%5C) を含む文字列リテラルを OData リソース パスで使用すると 404 エラーが発生します。

たとえば、文字列リテラルは、関数のパラメーターやエンティティ セットのキー値として OData リソース パスで使用できます。

/Employees/Total.GetCount(Name='Name%2F')

/Employees('Name%5C')

サービスがこのような要求を受け取ると、ホストは Web API ランタイムに渡す前に、それらのエスケープ シーケンスをエスケープ解除します。 これにより、次のような攻撃から保護されます。

http://www.contoso.com/..%2F..%2F/Windows/System32/cmd.exe?/c+dir+c:

これにより、Web API OData スタックから 404 エラー (Not Found) が返されます。 このエラーを防ぐには、クライアントでスラッシュ (%252F) と円記号 (%255C) の二重エスケープ シーケンスを使用する必要があります。 これは、/Employees?$filter=Name eq 'Name%2F' などのクエリ文字列では発生しません

エスケープされていないスラッシュ ('/') と円記号 ('') は、OData リソース パスの文字列リテラルでは使用できないことに注意してください。 スラッシュはパス区切り文字としてのみ表示し、円記号は OData リソース パスに一切使用しないようにする必要があります。 (どちらも OData クエリ文字列の一部で使用できます。)

回避策: DefaultODataPathHandler の Parse メソッドをオーバーライドして、文字列リテラルのスラッシュと円記号をエスケープしてから、実際に解析することができます。 このアプローチのサンプルについては、こちらをご覧ください。

OData v3

[Queryable]

[Queryable] 属性は非推奨です。 新しい OData v3 アプリケーションでは、System.Web.Http.OData.EnableQueryAttribute を使用する必要があります。

ODataHttpConfigurationExtensions.EnableQuerySupport 拡張メソッドによって、EnableQueryAttribute がグローバル フィルター コレクションに追加されるようになりました。 コントローラーに [Queryable] 属性がある場合、config.EnableQuerySupport() の呼び出しは [Queryable] 属性は失敗します

この問題を解決するには、QueryableAttribute のインスタンスをすべて System.Web.Http.OData.EnableQueryAttribute に置き換えることをお勧めします。

別の回避策として、Web API 構成で次のコードを使用します。

config.EnableQuerySupport(new QueryableAttribute());

属性ルーティング

問題: FromUri 属性で装飾された複合型のモデル バインドが、属性ルーティングを使用すると異なる動作をします。

問題: MVC/Web API を 5.2.0 パッケージでプロジェクトにスキャフォールディングすると、プロジェクトにまだ存在しないパッケージに対しては 5.1.2 パッケージが作成されます

ASP.NET MVC 5.2 の NuGet パッケージを更新しても、ASP.NET スキャフォールディングや ASP.NET Web アプリケーション プロジェクト テンプレートなどの Visual Studio ツールは更新されません。 これらのツールでは、ASP.NET ランタイム パッケージの旧バージョン (Update 2 の 5.1.2 など) を使用します。 その結果、ASP.NET スキャフォールディングでは、必要なパッケージがプロジェクトでまだ使用できない場合、旧バージョン (Update 2 の 5.1.2 など) がインストールされます。 ただし、Visual Studio 2013 RTM または Update 1 の ASP.NET スキャフォールディングでは、プロジェクト内の最新のパッケージは上書きされません。 プロジェクトのパッケージを Web API 2.2 または ASP.NET MVC 5.2 に更新した後に ASP.NET スキャフォールディングを使用する場合は、Web API と ASP.NET MVC のバージョンに一貫性があることを確認してください。

Microsoft.AspNet.OData 5.2.1

Microsoft.AspNet.OData 5.2.1 パッケージには NuGet 依存関係の更新プログラムが含まれていますが、バグ修正は含まれていません。 この更新プログラムにより、Microsoft.OData.Core 6.4.0 への厳密な依存関係はなくなったため、6.4.0 から 7.0.0 までの任意のバージョンにアップグレードできます。

Microsoft.AspNet.WebAPI 5.2.2

このリリースでは、Json.Net 6.0.4 の依存関係を変更しました。 Json.NET のこのリリースの新機能の詳細については、「Json.NET 6.0 リリース 4 - JSON マージ、依存関係の挿入」を参照してください。 このリリースには、Web API のその他の新機能やバグ修正はありません。 その後、この新しいバージョンの Web API に依存するように、Microsoft が所有する他のすべての依存パッケージを更新しました。

Microsoft.AspNet.WebAPI 5.2.3 ベータ版

リリースについては、こちらをご覧ください。 このリリースにはバグ修正のみが含まれています。