asp.net core 3.x Endpointターミナルルーティング1-基本紹介と使用
10504 ワード
前言
私は...Net 4.5直接ジャンプ.net core 3.xの、感じasp.Netというものは最初は4.5のowinから形成されたものです.現在、公式ドキュメントではルーティングに重点を置いており、従来のルーティングとの違いは特に説明されていないが、本編では主にターミナルルーティングに関する概念とどのように使用するかを紹介し、ルーティングを詳しく紹介することはできない.この参考公式ドキュメントはokである.将来、最下層の再深さ分析を研究する機会があれば.
参照先:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/routing?view=aspnetcore-3.1https://q.cnblogs.com/q/113644/ https://aregcode.com/blog/2019/dotnetcore-understanding-aspnet-endpoint-routing/
概要
最初に私たちが訪問したhttp://www.abc.com/a.aspx場合、サービス側はa.aspxというファイルが存在し、サービス側はこのファイルに基づいて対応するクラスのインスタンス処理要求を作成してくれます.その後、需要はますます複雑になり、要求アドレスを要求を実行するプロセッサに直接関連付け、マッピング関連付けにすることを目的としたルーティングが現れ、マッピングルールは私たち自身で構成された.asp.net core 3.x以前のこのルーティングシステムはmvc内部に含む.Netframework時代にはmvcを実現するための特殊なHttpModuleがあり、ルーティングシステムも含まれている.Netcoreは特殊なミドルウェアによってmvcを実現し,ルーティングシステムはこのミドルウェアに含まれる.この方法には問題があり、mvcはミドルウェアにすぎず、ルーティングシステムが含まれており、mvcミドルウェアの後に他のミドルウェアを追加したい場合、他のミドルウェアはルーティング関連情報にアクセスできない(不便かもしれない)という問題がある.またasp.Netcoreはmvcだけではなく、webapi、blazor、signlR、gRpcへのアクセスなど、将来的にはもっとありますが、私たちのルーティングシステムは、すべてのフレームワークを使用することができますか?
したがって,エンドポイントルーティングが出現し,ルーティングの根本的な目的はユーザリクエストアドレスをリクエストプロセッサにマッピングすることであり,最も簡単なリクエストプロセッサは依頼Funcであってもよいし,mvc/webapiのあるcontrollerのあるactionであってもよいので,抽象的な観点から1つのエンドポイントはリクエストを処理する依頼である.mvcにはactionにattributeがたくさんあるので、このリクエスト処理に委任された関連データを格納するためのセットも提供する必要があります.抽象的な観点から,1つの終端=要求を処理する依頼+に関連付けられた付加(メタ)データとして簡単に理解できる.mvcに対応して理解すると,終端点=action+はその上のattribute集合を適用する.しかし、終結点を覚えるのは抽象的な概念であり、mvcだけでなく、原理は次のようになります.
最初に私たちが訪問したhttp://www.abc.com/a.aspx場合、サービス側はa.aspxというファイルが存在し、サービス側はこのファイルに基づいて対応するクラスのインスタンス処理要求を作成してくれます.その後、需要はますます複雑になり、要求アドレスを要求を実行するプロセッサに直接関連付け、マッピング関連付けにすることを目的としたルーティングが現れ、マッピングルールは私たち自身で構成された.asp.net core 3.x以前のこのルーティングシステムはmvc内部に含む.Netframework時代にはmvcを実現するための特殊なHttpModuleがあり、ルーティングシステムも含まれている.Netcoreは特殊なミドルウェアによってmvcを実現し,ルーティングシステムはこのミドルウェアに含まれる.この方法には問題があり、mvcはミドルウェアにすぎず、ルーティングシステムが含まれており、mvcミドルウェアの後に他のミドルウェアを追加したい場合、他のミドルウェアはルーティング関連情報にアクセスできない(不便かもしれない)という問題がある.またasp.Netcoreはmvcだけではなく、webapi、blazor、signlR、gRpcへのアクセスなど、将来的にはもっとありますが、私たちのルーティングシステムは、すべてのフレームワークを使用することができますか?
したがって,エンドポイントルーティングが出現し,ルーティングの根本的な目的はユーザリクエストアドレスをリクエストプロセッサにマッピングすることであり,最も簡単なリクエストプロセッサは依頼Funcであってもよいし,mvc/webapiのあるcontrollerのあるactionであってもよいので,抽象的な観点から1つのエンドポイントはリクエストを処理する依頼である.mvcにはactionにattributeがたくさんあるので、このリクエスト処理に委任された関連データを格納するためのセットも提供する必要があります.抽象的な観点から,1つの終端=要求を処理する依頼+に関連付けられた付加(メタ)データとして簡単に理解できる.mvcに対応して理解すると,終端点=action+はその上のattribute集合を適用する.しかし、終結点を覚えるのは抽象的な概念であり、mvcだけでなく、原理は次のようになります.
使用方法
vsデフォルトテンプレートでaspを作成します.net core 3.xプロジェクトの場合、startupでこのようなコードが表示されます1 app.UseRouting();
2 app.UseEndpoints(endpoints => {
3 endpoints.MapControllerRoute(
4 name: "default",
5 pattern: "{controller=Home}/{action=Index}/{id?}");
6 });
ルートの登録
コードの2行目を見てください.次の3つのタスクがあります
1 app.UseRouting();
2 app.UseEndpoints(endpoints => {
3 endpoints.MapControllerRoute(
4 name: "default",
5 pattern: "{controller=Home}/{action=Index}/{id?}");
6 });
ここでルーティングは以前の書き方とあまり差がないので、デフォルト値や制約は公式ドキュメントを見に行きましょう.エンドポイントの作成も属性ルーティングを参照し、マイクロソフトはwebapiに属性ルーティングを推奨し、mvcは従来のルーティングを使用する.デフォルトのwebapiプロジェクトを作成するときにこのようなendpointsが表示されます.MapControllers();
エンドポイントのさらなるカスタマイズ
デフォルトでは、定義されたルーティングに基づいて一致するactionを見つけて最終的にターミナルを生成します.このターミナルを生成するプロセスには、endpointsを通じて参加することができます.MapControllerRouteの戻りオブジェクトに関連する拡張メソッドを呼び出します.本質的には、終了点の作成プロセスにいくつかの依頼を加えます.将来、終了点を作成すると、これらの依頼が呼び出されます.コードは次のとおりです.
1 endpoints.MapControllerRoute(
2 name: "default",
3 pattern: "{controller=Home}/{action=Index}/{id?}").Add(endpointBuilder=> {
4 // endpointBuilder action , attribute
5 // endpointBuilder
6 });
どうてきルーティング
app.UseEndpointsmvcではmvcとwebapiの使用を説明していますが、デフォルトではactionが対応するターミナルを作成し、リクエストが到着したときにターミナルに一致して直接実行されます.しかし、要求が来たときにどのcontrollerのどのactionを使用するかを自分で制御したい場合があります.具体的な方法は、クラスを定義し、D y n a micRouteValueTransformerを継承し、iocコンテナに登録し、コードを参照してください.
1 class MyRouteValueTransformer : DynamicRouteValueTransformer
2 {
3 public override ValueTask TransformAsync(HttpContext httpContext, RouteValueDictionary values)
4 {
5 // values
6 //
7 values.Add("controller", "jj");
8 values.Add("action", "kkk");
9 return new ValueTask(values);
10 }
11 }
12
13 public void ConfigureServices(IServiceCollection services)
14 {
15 services.AddSingleton();
16 services.AddControllers();
17 }
18
19 endpoints.MapDynamicControllerRoute("aaa/bbb/{id}");
これにより、将来のリクエストが到着すると、解析が終了した時点でMyRouteValueTransformerが呼び出され、解析したルートデータを取得し、いくつかのルーティングデータを置換/追加することでカスタマイズが可能になります.
ロールバックルーティング
デフォルトで到着が要求された場合、一致する終了点が見つからなければ、直接404になります.任意の終了点に一致していない場合、デフォルトの終了点を直接実行したい場合は、次のようにします.
endpoints.MapFallbackToController("{controller}/{action}/{id?}", "kkk", "jj");
要求が到着すると、任意の終了点に一致しない場合、jjControllerはデフォルトで実行する.kkkメソッド.この機能は動的ルーティングによって実現される可能性があることが想像できる.
いくつかの拡張方法がありますが、上記の説明があれば、何のために使われているのか推測できると思います.ルーティング登録についてはしばらくお話しします
カスタムミドルウェアターミナルデータを事前に取得
app.UseRouting();概要のステップ3に対応する、この拡張方法の内部にはミドルウェアが登録され、将来の要求が到着すると、現在の要求と一致する終了点を見つけてHttpContextに保存することができ、一致中に解析するルーティングデータはRequestにある.RouteValuesにあります.その後ろに自分のミドルウェアを入れることができます
1 app.UseRouting();
2 app.Use((conttext,next)=> {
3 var endpoint = conttext.GetEndpoint();//
4 var routeData = conttext.Request.RouteValues;//
// B
5 return next();
6 });