共用方式為


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 網站 (https://www.asp.net/web-api) 取得 ASP.NET Web API 2.2 的教學課程和其他資訊。

ASP.NET Web API 2.2 的新功能

OData v4

此版本新增了對 OData v4 通訊協定的支援。 如需詳細資訊,請參閱 Web API OData v4 文件

以下是 OData v4 的一些重要功能和變更:

屬性路由改善

屬性路由現在提供稱為 IDirectRouteProvider 的擴充功能,可讓您完全掌控如何探索和設定屬性路由。 IDirectRouteProvider 負責提供動作和控制器的清單,以及相關聯的路由資訊,以指定這些動作所需的路由設定。 呼叫 MapAttributes/MapHttpAttributeRoutes 時,可以指定 IDirectRouteProvider 實作。

藉由擴充預設實作 DefaultDirectRouteProvider,會讓自訂 IDirectRouteProvider 操作變得最為簡單。 這個類別提供個別可覆寫的虛擬方法,以變更探索屬性、建立路由項目,以及探索路由前置詞和區域前置詞的邏輯。

以下是您可以使用這個新擴充點執行的一些範例:

  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 或通用應用程式內為目標時,使用 Web API 用戶端 NuGet 套件來實作 Web API 用戶端邏輯。

已知問題和重大變更

本節旨在說明 ASP.NET Web API 2.2 中的已知問題和重大變更。

OData v4

模型建立器

問題:多載函數無法公開為 FunctionImport

如果有 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 錯誤 (找不到)。 若要避免此錯誤,您的客戶端應該使用斜線 (%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 Web MVC 5.2 ASP 的 NuGet 套件不會更新 Visual Studio 工具,例如 ASP.NET 建構或 ASP.NET Web 應用程式專案範本。 他們會使用舊版的 ASP.NET 執行階段套件 (例如 Update 2 中的 5.1.2)。 因此,如果您的專案中尚未提供必要套件的舊版 (例如 Update 2 中的 5.1.2),ASP.NET 建構會安裝它們。 不過,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.AspNet.WebAPI 5.2.3 搶鮮版 (Beta)

您可以在這裡了解有關此版本的資訊。 這個版本只包含錯誤修正。