Глобальный обработчик исключений ASP.Net Core MVC - PullRequest
1 голос
/ 25 июня 2019

Я занимаюсь разработкой приложения ASP.Net Core MVC с представлением Razor. Приложение состоит из множества форм, которые пользователь должен заполнить и отправить. У меня есть особая ситуация, в которой для регистрации всех исключений, которые возникают в приложении для входа. Я знаю, что ASP.Net MVC Core поставляется с глобальным промежуточным программным обеспечением для обработки исключений, где мы можем отследить все исключения, возникающие в приложении, и вести там же журнал. Но в то же время я должен показать всплывающее окно пользователю, что произошла ошибка при сохранении данных при отправке форм. Если его успех, то показать всплывающее окно успеха. Если я добавлю блок try-catch в Controller Action, я справлюсь с этим, но мне придется регистрировать то же самое из самого действия. Есть ли способ, которым я могу обработать все исключения в одном месте и показать всплывающее окно ошибки пользователю вместо перенаправления пользователя на другую страницу ошибки.

1 Ответ

1 голос
/ 26 июня 2019

Это длинная история (я использовал jquery для вызова API). Прежде всего, я добавляю обработку исключений следующим образом:

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

        var result = new BaseResponseDTO<string>()
        {
            ErrorCode = (int)HttpStatusCode.InternalServerError,
            ErrorMessage = ex.Message,
            Succeed = false,
        };

        var jsonResult = JsonConvert.SerializeObject(result);
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)code;
        return context.Response.WriteAsync(jsonResult);
    }
}

И затем зарегистрируйте его (он должен быть зарегистрирован до app.UseMvc ()):

app.UseMiddleware(typeof(ErrorHandlingMiddleware));
app.UseMvc();

Хорошо, после этого вызовите свой API. Я всегда возвращаю класс DTO так:

public class BaseResponseDTO<T>
{
    public bool Succeed { get; set; }
    public string ErrorMessage { get; set; }
    public T Result { get; set; }
    public int? ErrorCode { get; set; }
}

А теперь мой веб-API: иногда он возвращает значение, а иногда выдает исключение.

public BaseResponseDTO<string> TestApi()
    {
        var r = new Random();
        var random = r.Next(0, 2);
        if (random == 0)
            throw new Exception("My Exception");
        else
            return new BaseResponseDTO<string>() { Succeed = true, Result = "Some result..." };
    }

В конце, позвоните по jquery:

    function callApi() {
    $.ajax({
        type: 'GET',
        url: 'https://localhost:5001/Home/TestApi',
        data: null,
        dataType: 'json',
        success: function (data) {
            if (data.succeed) {
                alert(data.result);
            }
            else {
                alert(data.errorMessage);
            }
        },
        error: function (error) {
            debugger;
            alert(error.responseJSON.ErrorMessage);
        }
    });
}

Если Api возвращает исключение:

enter image description here

Если Api возвращает результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...