ASP.NET Core MVC是ASP.NET MVC框架的.NET Core副本。 您可以利用“模型-视图-控制器”设计模式利用ASP.NET Core MVC来构建跨平台,可扩展的高性能Web应用程序和API。 ASP.NET Core利用路由的优势将传入的请求映射到相应的控制器操作。
您可以从我之前的文章“ 揭秘: ASP.NET Core中的路由”中学习ASP.NET Core中的路由基础。 本文讨论了如何在ASP.NET Core 3.0 MVC中使用终结点路由。
端点路由是ASP.NET Core中新引入的功能,使您可以向请求处理管道中的中间件提供路由信息。 在引入端点路由之前,ASP.NET Core MVC中的路由解析是在请求处理管道的末尾执行的。 结果,在请求处理管道中的MVC中间件之前,任何处理请求的中间件都不知道路由信息(例如需要执行哪种操作方法)。 顺便说一下,终结点路由是ASP.NET 3.0和更高版本的一部分。
端点路由将HTTP请求在中间件管道的早期而不是末尾匹配到端点。 这允许管道中的中间件稍后访问已解析的端点并应用其他处理。 换句话说,端点路由解耦了路由匹配和端点调度功能,使您可以灵活地在应用程序中组合不同的中间件(MVC,CORS,Razor Pages,Blazor等)。
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果没有副本,则可以在此处下载Visual Studio 2019 。
首先,让我们在Visual Studio中创建一个ASP.NET Core项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建新的ASP.NET Core MVC项目。
这将在Visual Studio中创建一个新的ASP.NET Core项目。 在本文的后续部分中,我们将使用该项目来实现端点路由。
在解决方案资源管理器窗口中,选择项目中的Controllers文件夹,右键单击,然后单击Add-> Controller…以创建新的控制器。 将控制器类的名称指定为AuthorController。 接下来,用以下代码替换AuthorController类的代码。
[Route("api/[controller]")]
[ApiController]
public class AuthorController : ControllerBase
{
readonly Repository repository = new Repository();
[HttpGet]
public ActionResult GetAuthors()
{
var records = repository.GetAllAuthors();
return Ok(records);
}
}
我们将在本文的后续部分中使用AuthorController。
路由是一项功能,可公开端点并将传入的HTTP请求与控制器的操作方法进行匹配。 与Microsoft.AspNetCore.Routing命名空间有关的路由中间件负责处理请求和响应,检查请求并将它们与端点匹配,甚至修改在请求处理管道中流动的请求和响应消息。
您可以通过两种不同的方式在操作方法中指定路由-基于约定的路由和基于属性的路由。
以下代码段说明了如何在Startup类的Configure方法中使用约定路由。
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Author}/{action=GetAuthors}/{id?}");
});
使用基于属性的路由时,您会在控制器或操作方法上提及路由。 您可以为同一操作方法定义多个路由。 这是一个说明这一点的例子。
public class AuthorController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
public IActionResult Index()
{
return View();
}
[Route("Home/GetAuthor/{id:int}")]
public IActionResult GetAuthor(int id)
{
ViewBag.Id = id;
return View();
}
}
当您创建新的ASP.NET Core 3.0 MVC应用程序时,Visual Studio将为您创建默认路由。 这就是它的外观。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
}
此处显示的路由定义由两个参数组成-路由名称和路由模式。 该路由将匹配以下URL。
/Home/Index
/Author/Index
/Author/Index/12
路由利用了一对使用UseRouting和UseEndpoints扩展方法注册的中间件组件。 前者用于将请求匹配到端点,而后者用于执行匹配的端点。
请注意,UseRouting中间件应配置在所有其他中间件(包括身份验证,授权和任何自定义中间件)之前。 相比之下,UseEndpoints中间件应在最后配置。 下面的代码段对此进行了说明。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Author}/{action=GetAuthor}/{id?}");
});
}
如果要在运行时检查路由元数据,则可以使用以下代码并在Visual Studio中对其进行调试。
app.Use(async (context, next) =>
{
var endPoint = context.GetEndpoint();
var routes = context.Request.RouteValues;
});
您可以在ASP.NET Core 3.0 MVC应用程序中轻松设置路由。 为此,您需要对Startup类进行一些更改。 首先,您应该调用AddRazorPages方法,如下所示。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
接下来,应调用MapRazorPages方法,如下所示。 调用此方法时,会将Razor Pages服务,选项和约定添加到管道中。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Usual code
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(
name: "default",
pattern:
"{controller=Author}/
{action=GetAuthor}/{id?}");
});
}
请注意,可以为路由指定名称,以便可以使用具有相同参数的多个路由。 这样的路由称为命名路由。 以下代码段说明了如何使用命名路由。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Author}/{action=GetAuthors}/{id?}");
}
您还可以显式设置路由默认值,如下面的代码片段所示。
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action}/{id?}",
defaults: new {controller = "Home", action = "Index"});
您可以利用MapRazorPages扩展方法来为Razor视图页面启用路由。 以下代码段显示了如何实现此目的。
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
请注意,您可以对某些控制器和操作使用基于属性的路由,而在其他控制器和操作方法上使用基于约定的路由。 尽管同时使用这两种方法是完全有效的,但应注意,在同一操作方法中不能同时具有基于属性的路由和基于约定的路由。
ASP.NET 3.0为我们提供了一个可扩展的模块化框架,用于处理端点,URL和中间件。 在以后的文章中,我将更深入地讨论路由。 我们将探索ASP.NET Core 3.0中的高级路由功能,例如路由模板,路由约束,自定义路由约束等。
From: https://www.infoworld.com/article/3541611/how-to-use-endpoint-routing-in-aspnet-core-30-mvc.html