ASP.NET Core3.X端末ミドルウェアをエンドポイントルーティング運転に変換
引用する
先日NET Core3.1は発表して、そこで私は会社の1つの基础の通用するシステムを升格して、同时にいくつかの基础のモジュールを削除してもちろんこのいくつかの基础のモジュールと.NET Core3.1関系なく、その中に支払いモジュールが含まれていて、アップグレードが终わった后に静文(同僚)は私に支払いを削除したことを闻きましたか?そうですね.どうやって加えるか考えていません(今のところあまりよくないような気がしますが、再設計する必要があります).
物語はここから始まる
支払いを考えるときに私が考えているのは、支払いsdkをどのように直接システムに導入するか、そして一連の支払いが可能なルートを考えることです.私が考えなければならないのは、指定されたアドレスに応答する場合、so私はどのように私の目的を達成してミドルウェアをカスタマイズしたいのか、Use、Run、Map??
ルーティングのステップアップ
ルーティングは、要求URIをエンドポイントにマッピングし、これらのエンドポイントに送信された要求をスケジューリングする役割を果たす.ルーティングはアプリケーションで定義され、アプリケーションの起動時に構成されます.ルーティングは、要求に含まれるURLから値を抽出することを選択し、これらの値を要求の処理に使用することができる.アプリケーション内のルーティング情報を使用することで、ルーティングは、ターミナルにマッピングされたURLを生成することもできる.
ASP.NET Core 2.1以降では、ルーティングは、Irouterから入力されたURLをプロセッサにマッピングするインタフェースを実装することによって処理される.通常、インタフェースを直接実装するのではなく、MvcMiddlewareに直接依存してミドルウェアパイプの末端の実装に追加されます.要求がMvcMiddlewareに到達すると、入力要求URLパスに対応するコントローラおよびアクションを決定するために、パスが適用される.
そして、この要求は、プロセッサを実行する前に各種MVCフィルタを通過する.これらのフィルタは、ミドルウェアパイプを連想させる別の「パイプ」を形成し、場合によってはミドルウェアの動作をコピーする必要があります.典型的な例はCORS政策だ.各MVC操作およびミドルウェアパイプの他の「分岐」に対して異なるCORS戦略を実施するためには、内部である程度の繰り返しが必要である.
ブランチミドルウェアパイプは、通常、擬似ルーティングに使用されます.中間部品パイプにおけるMap()の拡張方法のように、入力パスに所定の接頭辞がある場合に、いくつかの中間部品を条件付きで実行できます.
次のようになります.
app.Map("/order", app => app.Run(async context =>
{
await context.Response.WriteAsync("Order");
})
);
この場合、Run()メソッドは、応答を返すため、「端末」ミドルウェアである.しかし、ある意味では、Mapブランチ全体がアプリケーションの「エンドポイント」に対応する.
ASP.NET Core 2.2では,MVCコントローラとしてのターミネータールーティングの新しいルーティング機構を導入した.この実装は本質的に内部実装MvcMiddlewareである.
ASP.NET Core 2.xでのMap()の使用
次に、呼び出しを続行するのではなく、対応するミドルウェアを直接返すミドルウェアをカスタマイズします.next依頼、基本的なミドルウェアです.
public class ApiEndpointMiddleware
{
private readonly RequestDelegate _next;
public ApiEndpointMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
context.Response.StatusCode = 200;
await context.Response.WriteAsync("Order");
}
}
ASP.NET Core 2.xでは、拡張方法で指定する経路を用いてミドルウェアにアクセスすることで、Startupに含めることができる.csのミドルウェアパイプで
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.Map("/order", app => app.UseMiddleware()); versionApp.UseMiddleware());
app.UseMvcWithDefaultRoute();
}
/orderまたは/order/1ルーティングにアクセスすると、カスタムミドルウェアが返す対応が得られます.
ミドルウェアをエンドポイントルーティングに変換
ASP.NET Core 3.0では,エンドポイントルーティングを用いているので,ルーティングステップはエンドポイントの呼び出しとは別である.実際には、2つのミドルウェアがあります.
これらは、2つの異なる役割を果たすため、中間部品パイプの2つの異なる点に追加されます.一般に、ルーティングミドルウェアは、後続のミドルウェアが実行されるエンドポイントに関する情報にアクセスできるように、パイプ内に予め存在すると考えられる.エンドポイントの呼び出しは、パイプのエンドポイントで行います.
次のようになります.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
このUseRouting()拡張メソッドは、パイプにEndpointRoutingMiddlewareを追加するとともに、UseEndpoints()拡張メソッドをパイプにEndpointMiddlewareを追加します.UseEndpoints()は、実際にアプリケーションのすべてのエンドポイントの場所を登録します.
では、カスタムミドルウェアをエンドポイントパスを使用してマッピングするにはどうすればいいのでしょうか.
概念的には、UseEndpoints()は、/order URLを一致するパスとして使用して、「バージョン」エンドポイントの登録を呼び出しに移動します.
endpoints.MapControllers();
endpoints.Map("/order",endpoints.CreateApplicationBuilder()
.UseMiddleware().Build()).WithDisplayName("order-api");
ASPについてNET Core 2.xの実装では,/order,/order/123などのエンドポイントルーティングにマッチングする.
例:
endpoints.Map("/order/{action}",null);
これは、/order/order/1と同時に一致しますが、/order/status/1とは一致しません.以前のバージョンよりずっと強力です.
前の例では、表示名(主にデバッグ目的で使用される)を指定しましたが、ライセンスポリシーやCORSポリシーなどの他の情報を追加することができ、他のミドルウェアはこれらの情報を問い合わせることができます.例:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.Map("/order/{action}",endpoints.CreateApplicationBuilder()
.UseMiddleware().Build()).WithDisplayName("order-api").RequireCors("AllowAllHosts")
.RequireAuthorization("AdminOnly");
});
CORSポリシー(AllowAllHosts)とライセンスポリシー(AdminOnly)をエンドポイントに追加しました.エンドポイントに到達する要求が到着した場合、エンドポイントを実行する前に対応する措置をとる.
リファレンス
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-3.1#endpoint-routing-differences-from-earlier-versions-of-routing