使用 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。模块化的封装结构使我们能够提供所需的封装,并创建精简简单的应用程序。