Исключения обработчика Оуэна из ApiController - PullRequest
1 голос
/ 05 марта 2020

Я не понимаю что-то связанное с промежуточным ПО Owin и как распространяются ht-исключения:

В классе запуска у меня есть этот код:

public static void Configuration(IAppBuilder app)
{
    app.Use<DebugMiddleware>();

    app.Use(async (ctx, next) =>
    {
        Debug.WriteLine("Incoming request 1: " + ctx.Request.Path);
        await next();
        Debug.WriteLine("Outgoing request 1: " + ctx.Request.Path);
    });


    app.Use(async (ctx, next) =>
    {
        Debug.WriteLine("Incoming request 2: " + ctx.Request.Path);
        await next();
        Debug.WriteLine("Outgoing request 2: " + ctx.Request.Path);
    });

    app.Use(async (ctx, next) =>
    {
        Debug.WriteLine("Incoming request 3: " + ctx.Request.Path);

        await ctx.Response.WriteAsync("<html><head></head><body>Hello World</body></html>");
        await next();

        Debug.WriteLine("Outgoing request 3: " + ctx.Request.Path);
    });

    app.Use(async (ctx, next) =>
    {
        Debug.WriteLine("Incoming request 4: " + ctx.Request.Path);

       //throw new Exception("New Exception thrown");

        Debug.WriteLine("Outgoing request 4: " + ctx.Request.Path);
    });
}

С классом DebugMiddleware, похожим на этот :

public class DebugMiddleware : OwinMiddleware
{
    public DebugMiddleware(OwinMiddleware next) : base(next) { }

    public override async Task Invoke(IOwinContext context)
    {
        try
        {
            Debug.WriteLine("Incoming request DebugMiddleware: " + context.Request.Path);

            await Next.Invoke(context);

            Debug.WriteLine("Outgoing request DebugMiddleware: " + context.Request.Path);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Catch exception in DebugMiddleware: " + ex.Message);
        }
    }
}

Когда я звоню, я получаю что-то вроде этого, это нормально:

Incoming request DebugMiddleware: /
Incoming request 1: /
Incoming request 2: /
Incoming request 3: /
Outgoing request 3: /
Outgoing request 2: /
Outgoing request 1: /
Outgoing request DebugMiddleware: /

Если я выбрасываю исключение в последнем промежуточном программном обеспечении, оно перехватывается и обрабатывается в DebugMiddleware:

Incoming request DebugMiddleware: /
Incoming request 1: /
Incoming request 2: /
Incoming request 3: /
Catch exception in DebugMiddleware: New Exception thrown

Если я добавлю ApiController и сгенерирую исключение, это больше не перехватывается в DebugMiddleware:

[RoutePrefix("api")]
public class TestApiController : ApiController
{
    [Route("test")]
    [HttpGet]
    public IHttpActionResult Test()
    {
        throw new Exception("Exc - Test");
    }
}

Это то, что я вижу:

Incoming request DebugMiddleware: /api/test
Incoming request 1: /api/test
Incoming request 2: /api/test
Incoming request 3: /api/test
Exception thrown: 'System.Exception' in Owin.Demo.dll
An exception of type 'System.Exception' occurred in Owin.Demo.dll but was not handled in user code
Exc - Test
Outgoing request 3: /api/test
Outgoing request 2: /api/test
Outgoing request 1: /api/test
Outgoing request DebugMiddleware: /api/test

Есть ли способ перехватить все обработанные исключения из контроллера в промежуточном программном обеспечении исключений?

...