Я не понимаю что-то связанное с промежуточным ПО 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
Есть ли способ перехватить все обработанные исключения из контроллера в промежуточном программном обеспечении исключений?