수색…
비고
미들웨어는 요청을 처리하고 응용 프로그램 파이프 라인의 다음 구성 요소로 전달할지 여부를 결정하는 소프트웨어 구성 요소입니다. 각 미들웨어에는 요청에 대해 수행 할 다양한 역할과 역할이 있습니다.
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.Items
는 IDictionary<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
});
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);
}