ASP.NETCore 路由機制-約定路由和特性路由
阿新 • • 發佈:2020-09-23
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); //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}); } }