1. 程式人生 > 實用技巧 >ASP.NETCore 路由機制-約定路由和特性路由

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

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