Я разрабатываю. NET Core 3 REST API с использованием C#.
Я много читал об этой топике c, и я реализовал специальное промежуточное программное обеспечение обработчика исключений, которое работает хорошо.
Но я понял, что сообщения об ошибках структурированы по-разному.
Например, я использую. Net Core Identity, и когда я пытаюсь сохранить имя пользователя, которое уже сохранено, то я получаю HTTP 400 со следующим ответом на ошибку: (извините, я не могу опубликовать изображения.)
error Array(1){
0: {
code: "...",
description: ".."
}
}
И я тоже использую проверку атрибута, которая дает HTTPErrorResponse:
error: {
.
.
.
errors:{
Password: Array(1) {
0: "The field..."
}
}
}
Наконец, мой класс обработчика пользовательских исключений дает ErroDTO, который содержит код и описание.
Итак, проблема в том, что есть 3 вещи, которые дают 3 разных ответа об ошибках, и я не знаете, как я могу справиться с этим, во Frontend, который является Angular проектом.
Я бы хотел обработать все ошибки и исключения с помощью моего класса ErroDto, но я не знаю, как преобразовать ошибки Identity или Attribute.
Я думаю, что я мог бы проверить проверку электронной почты и пароля непосредственно в конечной точке вместо использования атрибута, и я мог бы проверить, существует ли существующая электронная почта, и идентификация не будет сгенерировать ошибку. Но я думаю, что это не лучшая практика, и это будет много стандартного кода.
Это мой класс обработки исключений:
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception ex)
{
var code = HttpStatusCode.InternalServerError; // 500 if unexpected
ErrorDto error = new ErrorDto();
if (ex is WrongCredentialsException)
{
code = HttpStatusCode.OK;
WrongCredentialsException wrongCredentialsException = (WrongCredentialsException) ex;
error.Code = wrongCredentialsException.Code;
error.Description = wrongCredentialsException.Message;
}
var result = JsonConvert.SerializeObject(new { error });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}