(키는 요청 처리 :: 미들웨어 레슨 (21)의 제어) - 연구 노트 (다음) 전투 .NET 핵심 개발

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]).

추천

출처www.cnblogs.com/MingsonZheng/p/12459751.html