Глобальное исключение для try catch в asp.net core 2.2 или 3 - PullRequest
0 голосов
/ 26 июня 2019

Мне нужен глобальный обработчик исключений для всех методов контроллера, если возникает какая-либо ошибка (мне нужно отправить код ошибки клиенту). В настоящее время пишу блок try catch в каждом контроллере. Ниже приведен метод моего контроллера.Это хороший подход или, пожалуйста, предложите мне решение / подход, использующий asp.net core 3 preview.

[HttpPost]
        public ActionResult<Caste> InsertCaste(CasteModel caste)
        {
            try
            {

                var result = casteService.InsertCaste(caste);

                return CreatedAtAction(nameof(InsertCaste), new { id = result.Id }, result);
            }
            catch (Exception ex)
            {
                Log.Logger.log().Error(ex.Message);
                return null;
            }
        }

1 Ответ

2 голосов
/ 26 июня 2019

Один из подходов в ASP.NET Core заключается в использовании Middlewares.Внутри Startup класса и Configure метода добавьте этот фрагмент кода:

   app.UseExceptionHandler(errorApp =>
   {
        errorApp.Run(async context =>
        {
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    context.Response.ContentType = "application/json";

                    var contextFeature = context.Features.Get<IExceptionHandlerFeature>();
                    if(contextFeature != null)
                    {  
                        await context.Response.WriteAsync(new ExceptionInfo()
                        {
                            StatusCode = context.Response.StatusCode,
                            Message = "Internal Server Error."
                        }.ToString());
                    }
        });
    });

И ExceptionInfo класса:

public class ExceptionInfo
{
    public int StatusCode { get; set; }
    public string Message { get; set; }

    public override string ToString()
    {
        return JsonConvert.SerializeObject(this);
    }
}

Обновление 1:

Порядок промежуточных программ очень важен, вы ДОЛЖНЫ поставить его перед любыми другими промежуточными программами, такими как mvc:

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseExceptionHandler(... like code above);

    app.UseHttpsRedirection();
    app.UseMvc();

Обновление 2:

В случае регистрации ваших исключений вы можете добавить свой регистратор, добавив его тип к методу Configure в Startup классе:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger logger)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseExceptionHandler(... like code above);

    app.UseHttpsRedirection();
    app.UseMvc();
}

Обновление 3:

Используйте пользовательское промежуточное ПО в качестве глобального обработчика исключений:

public class CustomErrorHandlerMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILoggerManager _logger;

    public ExceptionMiddleware(RequestDelegate next, Ilogger logger)
    {
        _logger = logger;
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception ex)
        {
            _logger.LogError($"Something went wrong: {ex}");
            await HandleExceptionAsync(httpContext, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        return context.Response.WriteAsync(new ExceptionInfo()
        {
            StatusCode = context.Response.StatusCode,
            Message = "Internal Server Error"
        }.ToString());
    }
}

Затем используйте его в Configure метод:

app.UseMiddleware<CustomErrorHandlerMiddleware>();

TL; DR:

Обработка ошибок в ASP.NET Core

Промежуточное ПО ASP.NET Core

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