共用方式為


ASP.NET Web API 2.1 的新功能

Microsoft 提供

本主題旨在說明 ASP.NET Web API 2.1 的新增功能。

下載

執行時間功能在 NuGet 資源庫上發行為 NuGet 套件。 所有執行時間套件都遵循語意版本設定規格。 最新的 ASP.NET Web API 2.1 RTM 套件具有下列版本:“5.1.2”。 您可以透過 NuGet 安裝或更新這些套件。 此版本也包含 NuGet 上的對應當地語系化套件。

您可以使用 NuGet 套件管理員控制台來安裝或更新已發行的 NuGet 套件:

Install-Package Microsoft.AspNet.WebApi -Version 5.1.2

文件集

您可以從 ASP.NET 網站 (https://www.asp.net/web-api) 取得 ASP.NET Web API 2.1 RTM 的教學課程和其他資訊。

ASP.NET Web API 2.1 的新功能

全域錯誤處理

所有未處理的例外狀況現在可以透過一個中央機制來記錄,而且可以自訂未處理的例外狀況行為。

此架構支援多個例外狀況記錄器,這些記錄器全都會看到未處理的例外狀況及其發生內容的相關資訊,例如當時正在處理的要求。

例如,下列程式碼會使用 System.Diagnostics.TraceSource 來記錄所有未處理的例外狀況:

public class TraceSourceExceptionLogger : ExceptionLogger
{
    private readonly TraceSource _traceSource;

    public TraceSourceExceptionLogger(TraceSource traceSource)
    {
        _traceSource = traceSource;
    }

    public override void Log(ExceptionLoggerContext context)
    {
        _traceSource.TraceEvent(TraceEventType.Error, 1,
            "Unhandled exception processing {0} for {1}: {2}",
            context.Request.Method,
            context.Request.RequestUri,
            context.Exception);
    }
}

config.Services.Add(typeof(IExceptionLogger), 
    new TraceSourceExceptionLogger(new 
    TraceSource("MyTraceSource", SourceLevels.All)));

您也可以取代預設例外狀況處理程式,以便完整自訂在發生未處理例外狀況時所傳送的 HTTP 回應訊息。

我們提供了一個 範例,可透過熱門 ELMAH 架構記錄所有未處理的例外狀況。

屬性路由改善

屬性路由現在支援條件約束,啟用版本設定和標頭型路由選取。 此外,屬性路由的許多層面現在可透過 IDirectRouteFactory 介面和 RouteFactoryAttribute 類別來進行自訂。 路由前置詞現在可透過 IRoutePrefix 介面和 RoutePrefixAttribute 類別進行擴充。

我們提供了一個 範例,該範例會使用條件約束,以 'api-version' HTTP 標頭動態篩選控制器。

說明頁面改善

Web API 2.1 包含下列 API 說明頁面的增強功能:

  • 參數的個別屬性或傳回動作類型的文件。
  • 資料模型批註的文件。

說明頁面的 UI 設計也已更新,以配合這些變更。

IgnoreRoute 支援

Web API 2.1 支援透過 HttpRouteCollection 上的一組 IgnoreRoute 擴充功能方法來忽略 Web API 路由中的 URL 模式。 這些方法會導致 Web API 忽略任何符合指定範本的 URL,並允許主機視需要套用其他處理。

下列範例會忽略開頭為「內容」區段的 URI:

routes.IgnoreRoute("IgnoreContent", "content/{*paths}");
routes.MapHttpRoute("Default", "{controller}/{id}");

BSON 媒體類型格式化程式

Web API 現在支援用戶端和伺服器上的 BSON 連線格式。

若要在伺服器端啟用 BSON,請將 BsonMediaTypeFormatter 新增至格式器集合:

config.Formatters.Add(new BsonMediaTypeFormatter());

以下說明 .NET 用戶端如何使用 BSON 格式:

// Add Accept header.
client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/bson"));

// POST data in BSON format.
HttpResponseMessage response = await client.PostAsync<MyData>("api/MyData", data, new 
BsonMediaTypeFormatter());

// GET data in BSON format.
data = await response.Content.ReadAsAsync<MyData>(new MediaTypeFormatter[] { 
  new BsonMediaTypeFormatter() });

我們提供了顯示用戶端和伺服器端的範例

如需詳細資訊,請參閱 Web API 2.1 中的 BSON 支援

更好的非同步篩選支援

Web API 現在支援透過簡單的方式建立以非同步方式執行的篩選。 這項功能很有用,您的篩選需要執行非同步動作,例如存取資料庫。 之前,若要建立非同步篩選,您必須自行實作篩選介面,因為篩選基礎只會公開同步方法。 現在您可以覆寫篩選基礎的虛擬 On*Async 方法。

例如:

public class AsyncLoggingFilter : ActionFilterAttribute
{
    public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        await Trace.WriteAsync("Executing action named {0} for request {1}.", 
            actionContext.ActionDescriptor.ActionName, 
            actionContext.Request.GetCorrelationId());
    }
}

AuthorizationFilterAttributeActionFilterAttributeExceptionFilterAttribute 類別皆可支援 Web API 2.1 中的非同步。

用戶端格式化程式庫的查詢剖析

先前,System.Net.Http.Formatting 支援剖析和更新伺服器端程序代碼的 URI 查詢,但對等的可攜式程式庫遺漏此功能。 在 Web API 2.1 中,用戶端應用程式現在可以輕鬆地剖析及更新查詢字串。

下列範例示範如何剖析、修改及產生 URI 查詢。 (為了簡單起見,範例顯示主控台應用程式。)

// Query parsing
HttpValueCollection collection = new Uri("http://api/something?catId=3&catId=4&dogId=1,2").ParseQueryString();

Console.WriteLine(collection["catId"]); // output: 3,4
Console.WriteLine(collection["dogId"]); // output: 1,2

// Modify the query
collection.Add("dogId", "7");

// Index into the values
Console.WriteLine(collection["catId"]); // output: 3,4
Console.WriteLine(collection["dogId"]); // output: 1,2,7

// Recreate the query string
Console.WriteLine(collection.ToString()); // output: catId=3&catId=4&dogId=1%2C2&dogId=7

// Query generation
HttpValueCollection newCollection = new HttpValueCollection();

newCollection.Add("catId", "1");
newCollection.Add("dogId", "7");

// Index into the values
Console.WriteLine(newCollection["catId"]); // output: 1
Console.WriteLine(newCollection["dogId"]); // output: 7

// Create the query string
Console.WriteLine(newCollection.ToString()); // catId=1&dogId=7

已知問題和重大變更

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

屬性路由

屬性路由比對中的模棱兩可現在會回報錯誤,而不是選擇第一個相符項目。

禁止屬性路由使用 {controller} 参數,以及在放置於動作的路由上使用 {action} 参數。 這些參數極有可能造成模棱兩可。

將 MVC/Web API 轉換成具有 5.1 套件的專案,會導致專案中尚未存在於專案的 5.0 套件

更新 ASP.NET Web API 2.1 RTM 的 NuGet 套件不會更新 Visual Studio 工具,例如 ASP.NET Scaffolding 或 ASP.NET Web 應用程式專案範本。 它們使用舊版的 ASP.NET 執行時間套件 (5.0.0.0)。 因此,如果您的專案中尚未提供這些套件,ASP.NET 建構會安裝必要套件的舊版 (5.0.0.0)。 不過,Visual Studio 2013 RTM 或 Update 1 中的 ASP.NET 建構不會覆寫專案中的最新套件。

如果您在將套件更新至 Web API 2.1 或 ASP.NET MVC 5.1 之後使用 ASP.NET 建構,請確定 Web API 和 MVC 的版本一致。

類型重新命名

用於屬性路由擴充性的一些類型已從 RC 重新命名為 2.1 RTM。

舊的類型名稱 (2.1 RC) 新的類型名稱 (2.1 RTM)
IDirectRouteProvider IDirectRouteFactory
RouteProviderAttribute RouteFactoryAttribute
DirectRouteProviderContext DirectRouteFactoryContext

例外狀況篩選不會解除包裝非同步動作中擲回的彙總例外狀況

先前,如果非同步動作擲回 AggregateException,則例外狀況篩選器會解除包裝例外狀況,而 OnException 會取得基礎例外狀況。 在 2.1 中,例外狀況篩選器不會解除包裝,而 OnException 會取得原始的 AggregateException

錯誤修正

此版本也包含多個錯誤修正。

5.1.2 套件包含 IntelliSense 更新,但沒有錯誤修正。