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 的一些重要功能和變更:
- 支援 OData 模型中的別名屬性
- 支援 ODataConventionModelBuilder 中的 ComplexTypeAttribute、AssociationAttribute、TimesTampAttribute 和 ConcurrencyCheckAttribute
- 提供可針對動作提供易記標題的功能
- 與 ODL UriParser 整合
- 支援列舉、內含項目和單一
- 支援基本類型轉換
- 已新增 OData 函數支援
- 支援函數調用的參數別名
- 支援模型中的駝峰式大小寫命名慣例
- 支援 $filter 中的 cast()
- 支援開放式複雜類型
- 已移除 EntitySetController 和 AsyncEntitySetController
- 已將 $link 變更為 $ref
- 已新增屬性路由支援
- 使用 OData Core 程式庫 6.4.0
屬性路由改善
屬性路由現在提供稱為 IDirectRouteProvider 的擴充功能,可讓您完全掌控如何探索和設定屬性路由。 IDirectRouteProvider 負責提供動作和控制器的清單,以及相關聯的路由資訊,以指定這些動作所需的路由設定。 呼叫 MapAttributes/MapHttpAttributeRoutes 時,可以指定 IDirectRouteProvider 實作。
藉由擴充預設實作 DefaultDirectRouteProvider,會讓自訂 IDirectRouteProvider 操作變得最為簡單。 這個類別提供個別可覆寫的虛擬方法,以變更探索屬性、建立路由項目,以及探索路由前置詞和區域前置詞的邏輯。
以下是您可以使用這個新擴充點執行的一些範例:
支援路由屬性的繼承
範例:
在這裡,類似 “/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); } }
遵循您喜歡的一些慣例,為您的屬性路由提供預設路由名稱。 根據預設,屬性路由不會自動建立屬性路由的名稱。
在路由表結束之前,請先在一個中央位置修改屬性路由的路由範本。
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)
您可以在這裡了解有關此版本的資訊。 這個版本只包含錯誤修正。