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中使用终结点路由。
[ 同样在InfoWorld上:什么是敏捷方法论? [现代软件开发讲解 ]
端点路由是ASP.NET Core中新引入的功能,使您可以向请求处理管道中的中间件提供路由信息。 在引入端点路由之前,ASP.NET Core MVC中的路由解析是在请求处理管道的末尾执行的。 结果,在请求处理管道中的MVC中间件之前,任何处理请求的中间件都不知道路由信息(例如需要执行哪种操作方法)。 顺便说一下,终结点路由是ASP.NET 3.0和更高版本的一部分。
端点路由将HTTP请求在中间件管道的早期而不是末尾匹配到端点。 这允许管道中的中间件稍后访问已解析的端点并应用其他处理。 换句话说,端点路由解耦了路由匹配和端点调度功能,使您可以灵活地在应用程序中组合不同的中间件(MVC,CORS,Razor Pages,Blazor等)。
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果没有副本,则可以在此处下载Visual Studio 2019 。
创建一个ASP.NET Core MVC项目
首先,让我们在Visual Studio中创建一个ASP.NET Core项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建新的ASP.NET Core MVC项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
- 点击下一步。
- 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 在“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 3.0(或更高版本)。
- 选择“ Web应用程序(模型-视图-控制器)”作为项目模板。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
这将在Visual Studio中创建一个新的ASP.NET Core项目。 在本文的后续部分中,我们将使用该项目来实现端点路由。
在ASP.NET Core 3.0 MVC中创建新的控制器
在解决方案资源管理器窗口中,选择项目中的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。
了解ASP.NET Core中的路由
路由是一项功能,可公开端点并将传入的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中的路由定义
当您创建新的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
ASP.NET Core 3.0 MVC中的UseRouting与UseEndpoints
路由利用了一对使用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中配置路由
您可以在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?}");
});
}
在ASP.NET Core 3.0 MVC中使用命名路由
请注意,可以为路由指定名称,以便可以使用具有相同参数的多个路由。 这样的路由称为命名路由。 以下代码段说明了如何使用命名路由。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Author}/{action=GetAuthors}/{id?}");
}
在ASP.NET Core 3.0 MVC中设置路由默认值
您还可以显式设置路由默认值,如下面的代码片段所示。
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action}/{id?}",
defaults: new {controller = "Home", action = "Index"});
在ASP.NET Core 3.0 MVC中使用MapRazorPages
您可以利用MapRazorPages扩展方法来为Razor视图页面启用路由。 以下代码段显示了如何实现此目的。
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
在ASP.NET Core 3.0 MVC中使用混合路由
请注意,您可以对某些控制器和操作使用基于属性的路由,而在其他控制器和操作方法上使用基于约定的路由。 尽管同时使用这两种方法是完全有效的,但应注意,在同一操作方法中不能同时具有基于属性的路由和基于约定的路由。
ASP.NET 3.0为我们提供了一个可扩展的模块化框架,用于处理端点,URL和中间件。 在以后的文章中,我将更深入地讨论路由。 我们将探索ASP.NET Core 3.0中的高级路由功能,例如路由模板,路由约束,自定义路由约束等。
如何在ASP.NET和ASP.NET Core中执行更多操作:
- 如何在ASP.NET Core中使用内存中缓存
- 如何处理ASP.NET Web API中的错误
- 如何将多个参数传递给Web API控制器方法
- 如何在ASP.NET Web API中记录请求和响应元数据
- 如何在ASP.NET中使用HttpModules
- ASP.NET Core Web API中的高级版本控制
- 如何在ASP.NET Core中使用依赖项注入
- 如何在ASP.NET中使用会话
- 如何在ASP.NET中使用HTTPHandlers
- 如何在ASP.NET Core中使用IHostedService
- 如何在ASP.NET Core中使用WCF SOAP服务
- 如何提高ASP.NET Core应用程序的性能
- 如何使用RestSharp使用ASP.NET Core Web API
- 如何使用ASP.NET Core中的日志记录
- 如何在ASP.NET Core中使用MediatR
- 如何在ASP.NET Core中使用会话状态
- 如何在ASP.NET Core中使用Nancy
- 了解ASP.NET Web API中的参数绑定
- 如何在ASP.NET Core MVC中上传文件
- 如何在ASP.NET Core Web API中实现全局异常处理
- 如何在ASP.NET Core中实施运行状况检查
- ASP.NET中缓存的最佳实践
- 如何在.NET中使用Apache Kafka消息传递
- 如何在Web API上启用CORS
- 何时使用WebClient与HttpClient与HttpWebRequest
- 如何在.NET中使用Redis缓存
- 何时在.NET中使用Task.WaitAll与Task.WhenAll
From: https://www.infoworld.com/article/3541611/how-to-use-endpoint-routing-in-aspnet-core-30-mvc.html