Обработка ошибок ядра Dotnet в веб-API и Mvc Razor - PullRequest
0 голосов
/ 19 декабря 2018

В моем веб-приложении у меня есть как веб-API, так и обычный MVC. Я создал расширение для httpResponse

 public static void ShowApplicationError(this HttpResponse response, string exceptionMessage,string innerException)
    {
        var result = JsonConvert.SerializeObject(new { error = exceptionMessage ,detail=innerException });
        response.HttpContext.Response.WriteAsync(result);
    }

и использовал его в файле startup.cs для обработки исключений.

app.UseExceptionHandler(builder =>
            {
                builder.Run(async context =>
                {
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    var error = context.Features.Get<IExceptionHandlerFeature>();
                    if (error != null)
                    {
                        context.Response.ShowApplicationError(error.Error.Message, error.Error.InnerException.Message);
                    }
                });
            });

как это.это прекрасно работает для обоих.Я хочу дифференцировать ошибку для каждого запроса.я не хочу показывать ошибку json для mvc end, как мне это сделать.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Лучшее решение в этой ситуации - лучше разделить ваши проблемы.Сделайте ваш API отдельным csproj от вашего приложения MVC.Это даст вам гибкость для последующего развертывания.Если это существующий код, а не новый, я бы лоббировал его рефакторинг в отдельный проект API.

0 голосов
/ 20 декабря 2018

Невозможно напрямую отличить внутреннюю ошибку сервера от MVC или веб-API от Error.Message.Для MVC и Web api они оба наследуются от Controller или ControllerBase.

В общем, мы различаем их, добавляя api к пути маршрута для веб-API.Я предлагаю вам разработать свой проект с помощью MVC без API-маршрута и веб-API с API-маршрутом.Затем проверьте путь по ExceptionHandlerFeature.Path.

app.UseExceptionHandler(builder =>
{
    builder.Run(async context =>
    {
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        var error = context.Features.Get<IExceptionHandlerFeature>();
        var error1 = context.Features.Get<IExceptionHandlerFeature>() as ExceptionHandlerFeature;
        var error2 = context.Features.Get<IExceptionHandlerPathFeature>();
        var requestPath = error2.Path;
        if (error != null)
        {
            context.Response.ShowApplicationError(error.Error.Message, error.Error.InnerException.Message);
        }
    });
});
0 голосов
/ 19 декабря 2018

ContentType и заголовок Accept в HttpRequest различают тип вывода, которого достаточно в вашем случае.

вы можете проверить с помощью заголовка Accept.

if (context.Request.Headers["Accept"] == "application/json" || context.Request.Headers["Accept"] == "application/xml")
{
    //Api Request
}
else
{
    //other request.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...