【转】如何在ASP.NET Core 3.0 MVC中使用终结点路由

原文地址:https://blog.csdn.net/cxu0262/article/details/106255838

ASP.NET Core MVC是ASP.NET MVC框架的.NET Core副本。 您可以利用“模型-视图-控制器”设计模式利用ASP.NET Core MVC来构建跨平台,可扩展的高性能Web应用程序和API。 ASP.NET Core利用路由的优势将传入的请求映射到相应的控制器操作。

端点路由是ASP.NET Core中新引入的功能使您可以向请求处理管道中的中间件提供路由信息。 在引入端点路由之前,ASP.NET Core MVC中的路由解析是在请求处理管道的末尾执行的。 结果,在请求处理管道中的MVC中间件之前,任何处理请求的中间件都不知道路由信息(例如需要执行哪种操作方法)。 顺便说一下,终结点路由是ASP.NET 3.0和更高版本的一部分

端点路由将HTTP请求在中间件管道的早期而不是末尾匹配到端点。 这允许管道中的中间件稍后访问已解析的端点并应用其他处理。 换句话说,端点路由解耦了路由匹配和端点调度功能,使您可以灵活地在应用程序中组合不同的中间件(MVC,CORS,Razor Pages,Blazor等)。

创建一个ASP.NET Core MVC项目

首先,让我们在Visual Studio中创建一个ASP.NET Core项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建新的ASP.NET Core MVC项目。

1、启动Visual Studio IDE。
2、点击“创建新项目”。
3、在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
4、点击下一步。
5、在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
6、单击创建。
7、在“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 3.0(或更高版本)。
8、选择“ Web应用程序(模型-视图-控制器)”作为项目模板。
9、确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
10、确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
11、单击创建。

这将在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);
        }
    }

了解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中使用混合路由

请注意,您可以对某些控制器和操作使用基于属性的路由,而在其他控制器和操作方法上使用基于约定的路由。 尽管同时使用这两种方法是完全有效的,但应注意,在同一操作方法中不能同时具有基于属性的路由和基于约定的路由。

 

posted @ 2021-09-26 14:20  花影疏帘  阅读(202)  评论(0)    收藏  举报