수색…


비고

미들웨어는 요청을 처리하고 응용 프로그램 파이프 라인의 다음 구성 요소로 전달할지 여부를 결정하는 소프트웨어 구성 요소입니다. 각 미들웨어에는 요청에 대해 수행 할 다양한 역할과 역할이 있습니다.

ExceptionHandler 미들웨어를 사용하여 클라이언트에 사용자 정의 JSON 오류 보내기

사용자 정의 오류를 나타내는 클래스를 정의하십시오.

public class ErrorDto
{
   public int Code { get; set; }
   public string Message { get; set; }

   // other fields

   public override string ToString()
   {
      return JsonConvert.SerializeObject(this);
   }
}

그런 다음 ExceptionHandler 미들웨어를 다음 메소드에 넣는다. 미들웨어 순서가 중요하다는 점에 유의하십시오.

app.UseExceptionHandler(errorApp =>
    {
        errorApp.Run(async context =>
        {
            context.Response.StatusCode = 500; // or another Status 
            context.Response.ContentType = "application/json";

            var error = context.Features.Get<IExceptionHandlerFeature>();
            if (error != null)
            {
                var ex = error.Error;

                await context.Response.WriteAsync(new ErrorDto()
                {
                    Code = <your custom code based on Exception Type>,
                    Message = ex.Message // or your custom message
                    
                    ... // other custom data
                }.ToString(), Encoding.UTF8);
            }
        });
    });

응답을 설정하는 미들웨어 ContentType

헤더가 전송되기 전에 시작되는 마지막 이벤트이므로 HttpContext.Response.OnStarting 콜백을 사용하는 것이 좋습니다. 미들웨어 Invoke 메소드에 다음을 추가하십시오.

public async Task Invoke(HttpContext context)
{
    context.Response.OnStarting((state) =>
    {
        if (context.Response.StatusCode == (int)HttpStatusCode.OK)
        {
           if (context.Request.Path.Value.EndsWith(".map"))
           {
             context.Response.ContentType = "application/json";
           }
        }          
        return Task.FromResult(0);
    }, null);

    await nextMiddleware.Invoke(context);
}

미들웨어 체인을 통해 데이터 전달

문서에서 :

HttpContext.Items 컬렉션은 주어진 요청을 처리하는 동안 필요한 데이터를 저장할 수있는 가장 좋은 위치입니다. 각 요청 후에 그 내용은 폐기됩니다. 요청 중에 다른 시점에 작동하는 구성 요소 또는 미들웨어간에 통신하는 수단으로 사용하는 것이 가장 좋으며 매개 변수 또는 반환 값을 전달할 서로 직접적인 관계가 없습니다.

HttpContext.ItemsIDictionary<object, object> 형식의 간단한 사전 컬렉션입니다. 이 컬렉션은

  • HttpRequest 시작에서 사용할 수 있습니다.
  • 각 요청이 끝날 때 폐기됩니다.

키 입력에 값을 지정하거나 지정된 키의 값을 요청하여 액세스 할 수 있습니다.

예를 들어, 일부 미들웨어는 Items 컬렉션에 뭔가를 추가 할 수 있습니다.

app.Use(async (context, next) =>
{
    // perform some verification
    context.Items["isVerified"] = true;
    await next.Invoke();
});

나중에 파이프 라인에서 또 다른 미들웨어가 액세스 할 수 있습니다.

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Verified request? " + context.Items["isVerified"]);
});

실행,지도, 사용

운영

체인을 종료합니다. 이 후에는 다른 미들웨어 방법이 실행되지 않습니다. 파이프 라인의 끝에 배치해야합니다.

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello from " + _environment);
});

용도

다음 대리인 전후에 작업을 수행합니다.

app.Use(async (context, next) =>
{
    //action before next delegate
    await next.Invoke(); //call next middleware
    //action after called middleware
});

그것이 어떻게 작동하는지의 Ilustration : 여기에 이미지 설명을 입력하십시오.

MapWhen

분기 파이프 라인을 사용합니다. 조건이 충족되면 지정된 미들웨어를 실행합니다.

private static void HandleBranch(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Condition is fulfilled");
    });
}

public void ConfigureMapWhen(IApplicationBuilder app)
{
    app.MapWhen(context => {
        return context.Request.Query.ContainsKey("somekey");
    }, HandleBranch);
}

지도

MapWhen과 비슷합니다. 사용자가 요청한 경로가 매개 변수에 제공된 경로와 같으면 미들웨어를 실행합니다.

private static void HandleMapTest(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Map Test Successful");
    });
}

public void ConfigureMapping(IApplicationBuilder app)
{
    app.Map("/maptest", HandleMapTest);

}

ASP.net 핵심 문서 도구 기반



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow