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だけでなく、原理は次のようになります.
  • プログラムが起動する前に、プログラムにどのような終了点があるかを定義する必要があります.もちろん、手動で定義するのではなく、ターゲットフレームワークに基づいて自動的に生成されます.mvcにとって、プログラム内のルーティングに一致するactionを自動的に対応する終了点に変換することができます.他のフレームワークにも対応する方法があるはずです.いずれにしても、最終的には要求を処理するためのすべての東が終了点になります.このステップは、ルーティングを定義するときに自動的に完了する
  • である.
  • エンドポイントを定義するだけでなく、リクエストパスとエンドポイントの対応関係を定義し、将来のリクエストが到着したときに適切なエンドポイントを見つけてリクエストを処理することができます.これは、ルーティング
  • を定義することに相当します.
  • また、リクエストが到着したときにエンドポイントとパスの対応関係に基づいてエンドポイントを見つける解析器を定義する必要があります.マイクロソフトは、この解析器を表すために対応するミドルウェアを定義しています.
  • 最後に、上記のミドルウェアが実行された後、現在のリクエストに一致する終了点を取得し、最終的にその依頼処理リクエストを呼び出す必要があります.このミドルウェアはmvcミドルウェア
  • です.
  • このasp.net core 3.xのミドルウェアルーティングのデフォルト差は多くありません.このとき、私たちは自分のミドルウェアを定義して、ステップ3の後に置いて、終了点を手に入れていくつかの高度な処理をすることができます.マイクロソフトが定義したいくつかのミドルウェアもこのスイート
  • です.

    使用方法


    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つのタスクがあります
  • は、mvcに対してプログラム内のルーティングフォーマットと一致するactionを自動的に終了点に変換する終了点定義を作成する.5行目以降にendpointsをデバッグすることができる.DataSourceプロパティは、生成された終了点が
  • にあります.
  • urlと終点の対応関係を確立します.この関係はどこにありますか.私も知らない
  • mvcミドルウェアを登録する(将来のリクエストが到着し、以前にミドルウェアが現在のリクエストと一致する終了点を解析した後、mvc旅を開始する)
  • .
    ここでルーティングは以前の書き方とあまり差がないので、デフォルト値や制約は公式ドキュメントを見に行きましょう.エンドポイントの作成も属性ルーティングを参照し、マイクロソフトは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 });