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 국제 라이센스 계약 크리에이티브 커먼즈 저작자 표시 라이선스합니다.
무단 전재, 사용, 재 게시에 오신 것을 환영합니다,하지만 (링크가 포함 : http://www.cnblogs.com/MingsonZheng/)를 청 Ziming에 의해 서명 된 문서를 유지하기 위해 반드시 상업적인 목적으로 사용할 수 없다, 용지 사용권 변경에 따라 같은 일을 게시해야 .
당신은 질문이있는 경우에는, 저에게 연락 주시기 바랍니다 ([email protected]).