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