잘 받아 들여진 대답은 많은 도움이되었지만 런타임에 오류 상태 코드를 관리하기 위해 미들웨어에서 HttpStatusCode를 전달하고 싶었습니다.
이 링크 에 따르면 똑같이 할 아이디어가 있습니다. 그래서 나는 Andrei Answer를 이것과 병합했습니다. 최종 코드는 다음과 같습니다.
1. 기본 클래스
public class ErrorDetails
{
public int StatusCode { get; set; }
public string Message { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
2. 사용자 정의 예외 클래스 유형
public class HttpStatusCodeException : Exception
{
public HttpStatusCode StatusCode { get; set; }
public string ContentType { get; set; } = @"text/plain";
public HttpStatusCodeException(HttpStatusCode statusCode)
{
this.StatusCode = statusCode;
}
public HttpStatusCodeException(HttpStatusCode statusCode, string message) : base(message)
{
this.StatusCode = statusCode;
}
public HttpStatusCodeException(HttpStatusCode statusCode, Exception inner) : this(statusCode, inner.ToString()) { }
public HttpStatusCodeException(HttpStatusCode statusCode, JObject errorObject) : this(statusCode, errorObject.ToString())
{
this.ContentType = @"application/json";
}
}
3. 사용자 정의 예외 미들웨어
public class CustomExceptionMiddleware
{
private readonly RequestDelegate next;
public CustomExceptionMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await next(context);
}
catch (HttpStatusCodeException ex)
{
await HandleExceptionAsync(context, ex);
}
catch (Exception exceptionObj)
{
await HandleExceptionAsync(context, exceptionObj);
}
}
private Task HandleExceptionAsync(HttpContext context, HttpStatusCodeException exception)
{
string result = null;
context.Response.ContentType = "application/json";
if (exception is HttpStatusCodeException)
{
result = new ErrorDetails() { Message = exception.Message, StatusCode = (int)exception.StatusCode }.ToString();
context.Response.StatusCode = (int)exception.StatusCode;
}
else
{
result = new ErrorDetails() { Message = "Runtime Error", StatusCode = (int)HttpStatusCode.BadRequest }.ToString();
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
}
return context.Response.WriteAsync(result);
}
private Task HandleExceptionAsync(HttpContext context, Exception exception)
{
string result = new ErrorDetails() { Message = exception.Message, StatusCode = (int)HttpStatusCode.InternalServerError }.ToString();
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
return context.Response.WriteAsync(result);
}
}
4. 확장 방법
public static void ConfigureCustomExceptionMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<CustomExceptionMiddleware>();
}
5. startup.cs에서 메소드 구성
app.ConfigureCustomExceptionMiddleware();
app.UseMvc();
이제 계정 컨트롤러의 로그인 방법 :
try
{
IRepository<UserMaster> obj = new Repository<UserMaster>(_objHeaderCapture, Constants.Tables.UserMaster);
var Result = obj.Get().AsQueryable().Where(sb => sb.EmailId.ToLower() == objData.UserName.ToLower() && sb.Password == objData.Password.ToEncrypt() && sb.Status == (int)StatusType.Active).FirstOrDefault();
if (Result != null)//User Found
return Result;
else// Not Found
throw new HttpStatusCodeException(HttpStatusCode.NotFound, "Please check username or password");
}
catch (Exception ex)
{
throw ex;
}
위의 사용자를 찾지 못한 경우 HttpStatusCode.NotFound 상태 및
미들웨어 의 사용자 정의 메시지를 전달한 HttpStatusCodeException을 발생시키는 지 확인할 수 있습니다.
catch (HttpStatusCodeException ex)
제어를 전달할 차단됨이 호출됩니다.
개인 작업 HandleExceptionAsync (HttpContext 컨텍스트, HttpStatusCodeException 예외) 메서드
.
하지만 전에 런타임 오류가 발생하면 어떻게해야합니까? 이를 위해 예외를 throw하고 catch (Exception exceptionObj) 블록에서 catch 블록을 사용하여 제어를 전달합니다.
Task HandleExceptionAsync (HttpContext 컨텍스트, 예외 예외)
방법.
균일 성을 위해 단일 ErrorDetails 클래스를 사용했습니다.
UseExceptionHandler
미들웨어 를 사용해 보셨습니까 ?