iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
Modern Web

ASP.NET Core 入門實戰30天系列 第 9

Day 9 Routing

本篇重點

ASP .NET Core 3.x Route
Endponits
ASP .NET Core 2.x 先前版本的 Route


前言

ASP .NET Core 有別於 .NET MVC的設計方式,一樣提供了Middleware可以來拿使用
今天來稍微整理一下在ASP .NET Core 下是如何使用Route的


ASP .NET Core 3.x route

與前幾版最大的差異是使用新增加Endponits的概念
使用了兩個Middleware去處理route的事情
也是剛開始很容易搞混的地方

app.UseRouting(); 
//有點類似setting的感覺,在這個middleware會針對request的內容去做初始化

app.UseAuthorization();


//這邊才是真正去設定的地方,使用delegate去做設定
app.UseEndpoints(endpoints =>
{
  endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
});

UseEndpoints這個Middleware
提供了endpoints可以擴充一些方法去針對route去做設定


Endponits

ASP .NET Core 3.x 考量到個專案的整合性, 因此新增加Endponit,
提供裡一些擴充的方法

針對各種專案型態的擴充

新增了幾個方法例如

 endpoints.MapRazorPages(); //RazorPages
 endpoints.MapControllers(); //MVC
 endpoints.MapHub(<Thub>);//SingalR
 endpoints.MapGrpcService<GreeterService>(); //gRPC
 endpoints.MapBlazorHub(); //Blazor

實際打開個專案範本下所設定的也不相同
可以再MVC專案裡面擴充其他類型的頁面
例如在專案裡面註冊ndpoints.MapRazorPages()
由於Razor pages的目錄結構都建立在pages資料夾下
註冊之後就可以使用Razor的路由

MapHealthChecks

Endponit 也提供了一個MapHealthChecks方法,可以用來確認專案的執行狀況

首先在ConfigureServices先註冊一個AddHealthChecks()的方法
(官網上沒有提到這一個設定,但如果直接設定MapHealthChecks會有錯)
之後再Configure新增MapHealthChecks的設定

startup.cs

 public void ConfigureServices(IServiceCollection services)
{
   services.AddControllersWithViews();
   services.AddHealthChecks(); //先註冊AddHealthChecks方法
}
 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...
    endpoints.MapHealthChecks("/healthz"); //加上這一行
    //也可以提供登入的驗證方法
    //endpoints.MapHealthChecks("/healthz"); //加上這一行
    endpoints.MapControllerRoute(
          name: "default",
          pattern: "{controller=Home}/{action=Index}/{id?}");

直接呼叫專案下的/healthz ,就會回傳專案的健康狀況


ASP .NET Core 2.x route

目前看到大部分提到route的方式,大都是先前版本的做法
至於ASP .NET Core 3.x之後都還是有支援
只是預設的專案範本會有一些不相同

在先前版本主要route得分類有兩種:

  1. Convention Based Routing
    透過Startup.cs設定Middleware ,mapping 到相對的controller action
endpoints.MapControllerRoute(
          name: "default",
          pattern: "{controller=Home}/{action=Index}/{id?}");
  1. Attribute-Based Routing
    可以在action上方設定一個Attribute
    該action對應的view就得依照設定的路由
    此外要特別記得Attribute-Based的權限是高於Convention Based

舉例來說今天在HomeController的index新增了一組Attribute-Based

public HomeController(ILogger<HomeController> logger)
{
  _logger = logger;
}

[Route("Home/test")]
public IActionResult Index()
{
     return View();
}

雖然在startup.cs已經有設定好路由
但因為Attribute-Based的關係,所以會蓋掉共用的設定
URL必須要是https://localhost:5001/Home/test 才行

直接開始根目錄是找不到網頁的
必須要在上方再加入一組設定才行

[Route("")]//根目錄的router
[Route("Home/test")]
public IActionResult Index()
{
  return View();
}

參考資料:
https://dotnettutorials.net/lesson/routing-asp-net-core-mvc/

https://dotnettutorials.net/lesson/attribute-routing-in-asp-net-core-mvc/

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-3.1#configuring-endpoint-metadata


上一篇
Day 8 Static File 靜態檔案
下一篇
Day 10 ASP .NET Core MVC Life cycle
系列文
ASP.NET Core 入門實戰30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言