使用 ASP.NET Core MVC 的最小 ASP.NET 核心 Web API
使用 ASP.NET Core 1.0,MVC 和 Web API 框架已合併到一個名為 ASP.NET Core MVC 的框架中。這是一件好事,因為 MVC 和 Web API 共享許多功能,但總是存在細微差別和程式碼重複。
然而,將這兩者合併到框架 1 中也使得區分彼此更加困難。例如,Microsoft.AspNet.WebApi
代表 Web API 5.xx 框架,而不是新框架。但是,當你包括 Microsoft.AspNetCore.Mvc
(版本 1.0.0
)時,你會得到完整的包裝。這將包含 MVC 框架提供的所有開箱即用功能。如 Razor,標籤助手和模型繫結。
當你只想構建 Web API 時,我們不需要所有這些功能。那麼,我們如何構建簡約的 Web API?答案是: Microsoft.AspNetCore.Mvc.Core
。在新的世界中,MVC 被分成多個包,這個包只包含 MVC 框架的核心元件,例如路由和授權。
對於這個例子,我們將建立一個最小的 MVC API。包括 JSON 格式化程式和 CORS。建立一個空的 ASP.NET Core 1.0 Web 應用程式並將這些包新增到 project.json:
"Microsoft.AspNetCore.Mvc.Core": "1.0.0",
"Microsoft.AspNetCore.Mvc.Cors": "1.0.0",
"Microsoft.AspNetCore.Mvc.Formatters.Json": "1.0.0"
現在我們可以在啟動類中使用 AddMvcCore()
註冊 MVC:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore()
.AddCors()
.AddJsonFormatters();
}
AddMvcCore
返回一個 IMvcCoreBuilder
例項,允許進一步構建。配置中介軟體與通常相同:
public void Configure(IApplicationBuilder app)
{
app.UseCors(policy =>
{
policy.AllowAnyOrigin();
});
app.UseMvc();
}
控制器
舊Web API 附帶了自己的控制器基類:ApiController
。在新的世界裡沒有這樣的東西,只有預設的 Controller
類。不幸的是,這是一個相當大的基類,它與模型繫結,檢視和 JSON.NET 相關聯。
幸運的是,在新的框架中,控制器類不必從 Controller
派生,以便由路由機制獲取。只需在 Controller
中新增名稱即可。這允許我們構建自己的控制器基類。我們稱之為 ApiController
,只是為了舊時的緣故:
/// <summary>
/// Base class for an API controller.
/// </summary>
[Controller]
public abstract class ApiController
{
[ActionContext]
public ActionContext ActionContext { get; set; }
public HttpContext HttpContext => ActionContext?.HttpContext;
public HttpRequest Request => ActionContext?.HttpContext?.Request;
public HttpResponse Response => ActionContext?.HttpContext?.Response;
public IServiceProvider Resolver => ActionContext?.HttpContext?.RequestServices;
}
[Controller]
屬性指示預設控制器發現機制將型別或任何派生型別視為控制器。[ActionContext]
屬性指定當 MVC 建立控制器時應使用當前 ActionContext
設定屬性。ActionContext
提供有關當前請求的資訊。
ASP.NET Core MVC 還提供了一個
ControllerBase
類,它提供了一個沒有檢視支援的控制器基類。它仍然比我們的要大得多。如果你覺得方便,請使用它。
結論
我們現在可以使用新的 ASP.NET Core MVC 框架構建一個最小的 Web API。模組化的封裝結構使我們能夠提供所需的封裝,並建立精簡簡單的應用程式。