Пользовательское исключение промежуточного программного обеспечения ASP.NET Core Web Api - PullRequest
0 голосов
/ 28 июня 2019

Промежуточное программное обеспечение ASP.NET Core Web Api преобразует пользовательское исключение в базовое исключение

Я создал собственный класс исключений и использую его как исключение. Промежуточное программное обеспечение ловит его, но выдает базовое исключение вместо пользовательского исключения. Я не могу понять, почему он не ловит пользовательское исключение.

Пользовательское исключение

public class CustomException : Exception
{
    public int HttpStatusCode { get; private set; }

    public CustomException()
    {

    }

    public CustomException(int httpStatusCode, string message):base(message)
    {
        HttpStatusCode = httpStatusCode;
    }
}

Middleware

public class ExceptionMiddleware
{
    public readonly RequestDelegate _next;
    public ExceptionMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch(CustomException ex)
        {
            await HandleExceptionAsync(httpContext, ex);
        }
        catch(Exception ex)
        {
            await HandleExceptionAsync(httpContext, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        int statusCode = (int)HttpStatusCode.InternalServerError;
        if (ex is CustomException)
        {
            CustomException se = ex as CustomException;
            statusCode = se.HttpStatusCode;
        }
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = statusCode;

        return context.Response.WriteAsync(JsonConvert.SerializeObject(new InternalServerErrorResponse(ex.Message)));
    }
}

Исключение брошено

throw new CustomException(StatusCodes.Status422UnprocessableEntity, "User is already registered!");

Когда генерируется исключение, промежуточное ПО не перехватывает пользовательское исключение, а создает базовое исключение. Это всегда идет в блок кода ниже

catch(Exception ex)
{
     await HandleExceptionAsync(httpContext, ex);
}

Пожалуйста, сообщите.

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Вы можете использовать фильтр исключений для обработки исключений и легко манипулировать ответом.

public class ExceptionFilter : IExceptionFilter
{


    public ExceptionFilter(IHostingEnvironment env, ILogger<JsonExceptionFilter> logger)
    {
        _env = env;
        _logger = logger;
    }

    public void OnException(ExceptionContext context)
    {
        var error = new ApiResponse();
        var exceptionName = context.Exception.GetType().Name;
        var message = context.Exception.Message;

        if (_env.IsDevelopment())
        {
            error.Message = context.Exception.Message;
            error.Detail = context.Exception.StackTrace;  
        }
        else
        {
           //Prevent To Show Exception Messages On Production
            error.Message = "Server Error Occured";
            error.Detail = "Something wrong happened";  
        }

        context.Result = new ObjectResult(error)
        {
            //Manipulate Status Code
            StatusCode = 500
        };
    }

}

И зарегистрироваться в Startup.cs

public void ConfigureServices(IServiceCollection services){

        services.AddMvc(options =>
        {
            //Catch the exceptions
            options.Filters.Add<ExceptionFilter>();
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

 }
0 голосов
/ 28 июня 2019

Вы должны указать своему приложению использовать этот метод middleware in configure в вашем классе startup следующим образом -

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerManager logger){
    app.ExceptionMiddleware();
}
...