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}); } }