21 |ミドルウェア:要求処理の制御への鍵
地図場合は少し複雑なロジックは、そのURLアドレスを決定するために、そして特別審査員が行うだけでなく、あなたは、デリゲートの決定ロジックになることを行うことができるとき
私たちは、アドレスがABCが含まれている要求されたときを決定する必要があり、出力の新しいABC
app.MapWhen(context =>
{
return context.Request.Query.Keys.Contains("abc");
}, builder =>
{
builder.Run(async context =>
{
await context.Response.WriteAsync("new abc");
});
});
プログラムを起動し、出力はありません
我々は、デフォルトのアドレス入力?Abcの= 1に戻って起動すると、新しいABCの出力を見ることができます
ここで使用される方法を実行し、この方法で使用される一つが使用されます
app.Map("/abc", abcBuilder =>
{
abcBuilder.Use(async (context, next) =>
{
//await context.Response.WriteAsync("Hello");
await next();
await context.Response.WriteAsync("Hello2");
});
});
ファイル名を指定して実行と使用との違いは、それがどのようなものですか?
次の注入を来る、我々はミドルウェアとして完全な登録のようにできることを意味を使用して、我々はミドルウェアに従うかどうかを決定することができます
これが私たちのミドルウェア実行の終わりであると言い返却要求、それは、ミドルウェアの実装の後ろではない意味を実行します
どのように我々は我々自身のミドルウェアそれを設計するようUseEndpointsをUseRouting好きですか?
ここMyMiddlewareの良い定義
namespace MiddlewareDemo.Middlewares
{
class MyMiddleware
{
RequestDelegate _next;
ILogger _logger;
public MyMiddleware(RequestDelegate next, ILogger<MyMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
using (_logger.BeginScope("TraceIdentifier:{TraceIdentifier}", context.TraceIdentifier))
{
_logger.LogDebug("开始执行");
await _next(context);
_logger.LogDebug("执行结束");
}
}
}
}
ミドルウェアは、合意された方法、ミドルウェアによって定義またはクラスがメソッド呼び出しInvokeAsync例えば、A法が含まれる、タスク、のHttpContext、実際には、同じミドルウェアを委託されていることを理解すべきであるパラメータを返します長い私たちのクラスなどの方法が含まれるように、それはにミドルウェアとして登録することができ、かつフレームを識別するために、
またMyBuilderExtensionsがあります定義されています
namespace Microsoft.AspNetCore.Builder
{
public static class MyBuilderExtensions
{
public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder app)
{
return app.UseMiddleware<MyMiddleware>();
}
}
}
当社のミドルウェアは、この方法がUseMyMiddlewareある、に登録しました
この定義では、我々は独自のミドルウェアを使用することができます
app.UseMyMiddleware();
次のようにプログラムを起動し、出力は次のようになります。
コンソール出力
dbug: MiddlewareDemo.Middlewares.MyMiddleware[0]
=> RequestPath:/weatherforecast RequestId:0HLU50UEM3M9F:00000001, SpanId:|77f92fe8-4a6d800968327989., TraceId:77f92fe8-4a6d800968327989, ParentId: => TraceIdentifier:0HLU50UEM3M9F:00000001
开始执行
dbug: MiddlewareDemo.Middlewares.MyMiddleware[0]
=> RequestPath:/weatherforecast RequestId:0HLU50UEM3M9F:00000001, SpanId:|77f92fe8-4a6d800968327989., TraceId:77f92fe8-4a6d800968327989, ParentId: => TraceIdentifier:0HLU50UEM3M9F:00000001
执行结束
ページコントローラ出力
[{"date":"2020-03-11T23:30:55.3411696+08:00","temperatureC":20,"temperatureF":67,"summary":"Warm"},{"date":"2020-03-12T23:30:55.3417863+08:00","temperatureC":52,"temperatureF":125,"summary":"Bracing"},{"date":"2020-03-13T23:30:55.3417916+08:00","temperatureC":-3,"temperatureF":27,"summary":"Mild"},{"date":"2020-03-14T23:30:55.341792+08:00","temperatureC":35,"temperatureF":94,"summary":"Balmy"},{"date":"2020-03-15T23:30:55.3417923+08:00","temperatureC":37,"temperatureF":98,"summary":"Sweltering"}]Hello2
あなたはサーキットブレーカーを実装する場合は、行をコメントアウトし、論理的なフォローアップの実装にはありません
_logger.LogDebug("开始执行");
//await _next(context);
_logger.LogDebug("执行结束");
プログラムを起動し、ページが何も出力しません、それが唯一のコントローラは、フォローアップを行っていない、コンソールでミドルウェアの実行を出力します
あなたが制御要求を行う、独自のミドルウェアを使用できることを意味し、非常に柔軟な制御の回路ブレーカのこの認識、
ミドルウェアの使用の過程では、細心の注意を必要とするミドルウェアの実行タイミングの順番を決定するために登録するミドルウェアであり、ミドルウェアは、遮断器のいくつかの効果になり、特定のミドルウェアは、いくつかの要求されたコンテンツを行います処理
より多くの重要なポイントは、あなたが開始すると、後続のミドルウェアは、そのヘッダを操作しに行くことができないときにアプリケーションが応答書き込みを参照していることでもあり、それは注意すべきです
コンテンツは、本体の出力に応答して開始されたか否かによって判断することができるContext.Response.HasStarted、出力内容と、操作は、ヘッダを持っていないであろう
この作品は、ある非営利- -同一条件許諾4.0の国際ライセンス契約クリエイティブ・コモンズのライセンスのために。
転載、使用、再投稿へようこそ、しかし鄭Ziming(リンクを含む:http://www.cnblogs.com/MingsonZheng/)によって署名された記事を保つようにしてください、商業目的のために使用してはならない、紙のライセンス変更に基づいて、同じ作業を公開するようにしてください。
ご質問があれば、私に連絡してください([email protected])。