Câu trả lời được chấp nhận tốt đã giúp tôi rất nhiều nhưng tôi muốn vượt qua httpStatusCode trong phần mềm trung gian của mình để quản lý mã trạng thái lỗi khi chạy.
Theo liên kết này, tôi có một số ý tưởng để làm như vậy. Vì vậy, tôi đã hợp nhất câu trả lời Andrei với điều này. Vì vậy, mã cuối cùng của tôi là dưới đây:
1. Lớp cơ sở
public class ErrorDetails
{
public int StatusCode { get; set; }
public string Message { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
2. Loại lớp ngoại lệ tùy chỉnh
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. Middleware ngoại lệ tùy chỉnh
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. Phương pháp mở rộng
public static void ConfigureCustomExceptionMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<CustomExceptionMiddleware>();
}
5. Cấu hình phương thức trong startup.cs
app.ConfigureCustomExceptionMiddleware();
app.UseMvc();
Bây giờ phương thức đăng nhập của tôi trong Trình điều khiển tài khoản:
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;
}
Ở trên, bạn có thể thấy nếu tôi không tìm thấy người dùng thì hãy nâng cao httpStatusCodeException, trong đó tôi đã vượt qua trạng thái httpStatusCode.NotFound và một thông báo tùy chỉnh
Trong phần mềm trung gian
bắt (ví dụ: httpStatusCodeException)
bị chặn sẽ được gọi sẽ vượt qua sự kiểm soát
nhiệm vụ riêng xử lýExceptionAsync (bối cảnh httpContext, ngoại lệ httpStatusCodeException)
.
Nhưng nếu tôi gặp lỗi thời gian chạy trước đây thì sao? Vì vậy, tôi đã sử dụng thử khối bắt, ném ngoại lệ và sẽ bị bắt trong khối bắt (Exception ngoại lệObj) và sẽ chuyển quyền kiểm soát tới
Nhiệm vụ Xử lý ngoại lệAsync (bối cảnh httpContext, ngoại lệ)
phương pháp.
Tôi đã sử dụng một lớp ErrorDetails để thống nhất.
UseExceptionHandler
phần mềm trung gian chưa?