使用 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。模組化的封裝結構使我們能夠提供所需的封裝,並建立精簡簡單的應用程式。