промежуточное ПО для пользовательских исключений не улавливает исключение - PullRequest
0 голосов
/ 18 июня 2020

У меня есть такая настраиваемая установка промежуточного ПО.

        using AutoWrapper.Wrappers;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Threading.Tasks;

    namespace BBBankApi
    {
        public class ExceptionMiddleware
        {
            private readonly RequestDelegate _next;
            private readonly ILogger<ExceptionMiddleware> _logger;

            public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger)
            {
                _next = next;
                _logger = logger;
            }
            public async Task Invoke(HttpContext context)
            {
                try
                {
                    await _next.Invoke(context);
                }
                catch (Exception ex)
                {
                    if (context.Response.HasStarted)
                    {
                        throw;
                    }

                    _logger.LogError(new EventId(), ex, ex.Message);
                    context.Response.ContentType = "application/json";
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    var json = JsonConvert.SerializeObject(new ApiException(ex));
                    await context.Response.WriteAsync(json);
                }
            }
        }
        public static class CustomExceptionMiddlewareExtensions
        {
            public static IApplicationBuilder UseCustomExceptiontusMiddleware(this IApplicationBuilder builder)
            {
                return builder.UseMiddleware<ExceptionMiddleware>();
            }

        }
    }

при запуске он настроен следующим образом

   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();                
        }

        app.UseCustomExceptiontusMiddleware(); //<-- *******Right Here
        app.UseApiResponseAndExceptionWrapper();


        app.UseCors(MyAllowSpecificOrigins);
        app.UseMvc(b =>
        {
            b.MapODataServiceRoute("odata", "odata", GetEdmModel());
        });
        app.UseHttpsRedirection();



        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();

        });
    }

когда я делаю запрос, я нажимаю await _next.Invoke (context); строка, но я создаю новое исключение («Что-то пошло не так») внутри кода. но это исключение не получено в блоке catch в промежуточном продукте.

Я использую AutoWrapper из https://vmsdurano.com/autowrapper-prettify-your-asp-net-core-apis-with-meaningful-responses/, но я не думаю, что это имеет большое значение здесь.

1 Ответ

0 голосов
/ 18 июня 2020

Что я, хотя не должно быть проблемой, было проблемой. Мне пришлось использовать промежуточное ПО после автообертки.

            app.UseApiResponseAndExceptionWrapper();
        app.UseCustomExceptiontusMiddleware();

это сработало.

...