• ASP.NETCore 路由机制-约定路由和特性路由


    asp.netcore 路由机制分为 约定路由特性路由。本文采用asp.netcore 3.1来演示。

    1.约定路由:一般来说,asp.netcore mvc 多数采用约定路由。

    asp.netcore mvc 约定路由配置如下:

    public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                //提前注入MVC服务
                services.AddControllersWithViews();
            }
    
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                    app.UseHsts();
                }
                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseRouting();
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    //约定路由,需要在 ConfigureServices 方法中提前注入 mvc 服务。
                    endpoints.MapControllerRoute(
                        name: "default",
                        pattern: "{controller=Home}/{action=Index}/{id?}");// 配置默认的路由地址是 home/index
                });
            }
        }

    控制器 代码如下:通过约定路由,根据相应的 Controller 和action ,就可以访问。

    public class HomeController : Controller
        {
            private readonly ILogger<HomeController> _logger;
    
            public HomeController(ILogger<HomeController> logger)
            {
                _logger = logger;
            }
    
            public IActionResult Index()
            {
                //return Ok(1);
                //return this.Ok("123");
                //return this.NotFound();
                //return this.File(); //返回文件
                //return this.Content("这里是返回一段文字");
    
                var st = new Student
                {
                    Id = 1,
                    FirstName = "Fyy",
                    LastName = "hehe"
                };
    
                /*最终返回到页面的是Json.
                返回到页面的具体类型,并不是有Controller决定的。Controller 只是把学生的st,放到了 ObjectResult对象中,
                并返回给HTTP请求管道。至于将ObjectResult 以何种形式返回到页面,是由管道的其他环节来处理的。
                */
                /*
                 整个请求的原理:Http请求过来后,经过HTTP请求处理管道,通过路由解析中间件,找到相应的控制器下的Action。Action 处理完逻辑后,
                 将对象St 装入 ObjectResult对象中,并将其返回给HTTP请求处理管道。管道接收到返回的 ObjectResult之后,
                 将其写入(转成)HTTP响应并返回给客户端,此时ObjectResult需要决定需要以Json还是XML或其他格式返回给客户端。
                 */
                return new ObjectResult(st);// 返回json

                  //return new JsonResult(st);//返回json
                  //return Json(st);//返回json MVC特有。

    //return View();//返回的是Index.CSHTML视图
    
                //return View("Student"); //返回的是Student.cshtml视图。需要注入MVC服务。/ Views / Home1 / Student.cshtml
                                        // / Views / Shared / Student.cshtml
            }
    
            public IActionResult Privacy()
            {
                return View();
            }
    
            [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
            public IActionResult Error()
            {
                return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
            }
        }

    2.特性路由:restfull api 或者webapi,通常采用特性路由。

    asp.netcore webapi 特性路由配置如下:

    public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                //webapi 提前注入控制器服务
                services.AddControllers();
            }
    
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseHttpsRedirection();
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    //需要提前注入控制器服务,才能使用特性路由。
                    endpoints.MapControllers();
                });
            }
        }

     控制器通过加上特性,来配置具体的路由:

    [ApiController]
        [Route("tt/[action]")] //通过tt/action 就能访问 action为具体的方法。
        //[Route("[controller]/[action]")]//通过具体的controller/action 就能访问
        //[Route("tt")]//只指定控制的路由,可在具体方法上再指定action的路由
        public class MyController:ControllerBase
        {
            private readonly ILogger<MyController> _logger;
    
            /// <summary>
            /// 构造函数注入
            /// </summary>
            /// <param name="logger"></param>
            public MyController(ILogger<MyController> logger)
            {
                _logger = logger;
            }
    
            //[Route("")]//相当于不加任何action路由
            //[Route("aa")]
            //[Route("[action]")]//不区分大小写
            [HttpGet]
            public IActionResult GetData()
            {
                return new ObjectResult(new { name="zhangsan", age=12});
            }
        }
  • 相关阅读:
    数据库编程总结
    Excel文件操作方式比较
    大数据导入Excel
    导出Excel
    duilib库分析: 消息流程分析
    ucosII移植
    Log Parser Studio 分析 IIS 日志
    google 搜索关键字技巧
    未知的反物质世界的瞎想
    Scratch 简单的小游戏 --- 碰碰球
  • 原文地址:https://www.cnblogs.com/Fengyinyong/p/13721245.html
Copyright © 2020-2023  润新知