如何捕获控制器激活器异常以记录它们?

问题描述 投票:0回答:1

我有一个 asp.net Framework 4.8 WebApi2 项目,当我向给定控制器上的操作发送请求时,我收到 500 错误,内容显示这是由于缺少依赖项造成的。非常正确,我忘记配置我的依赖项之一。

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>An error occurred when trying to create a controller of type 'ValuesController'. Make sure that the controller has a parameterless public constructor.</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace> at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()</StackTrace>
<InnerException>
<Message>An error has occurred.</Message>
<ExceptionMessage>Type 'ApiLab.WebApi.Controllers.ValuesController' does not have a default constructor</ExceptionMessage>
<ExceptionType>System.ArgumentException</ExceptionType>
<StackTrace> at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)</StackTrace>
</InnerException>
</Error>

有一段时间,我从另一个应用程序调用 api,但对于任一应用程序,请求都消失了,我的日志中没有显示任何内容,这对于更快地找到问题的路径非常有帮助。

在 WebApi 项目中,我有一个异常过滤器类

UnhandledExceptionFilter : ExceptionFilterAttribute
来记录任何未处理的异常。我已经在全球范围内注册了它,就像

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Filters.Add(new UnhandledExceptionFilter());

并且覆盖所有基础

TestHandleErrorAttribute : HandleErrorAttribute
注册使用

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new TestHandleErrorAttribute());

我相信,鉴于控制器 DI 将在请求管道期间发生,那么未处理的异常将落入其中一个过滤器中,然后我可以使用它来记录它,但这种情况并没有发生。我已经测试过从另一个控制器上的操作中抛出异常,并且 UnhandledExceptionFilter 按预期工作,因此我确信这是有效的。

我猜测依赖解析要么发生在上下文之外,因此最终不会被传递到其中一个过滤器,要么它发生在该上下文内,但有些东西正在进一步吞噬它。

那么有谁知道我需要什么才能记录该异常?

c# asp.net-web-api autofac exceptionfilterattribute
1个回答
0
投票

https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection#the-web-api-dependency-resolver

找到“解决方案”的线索

我将 Autofac 与 ootb AutofacWebApiDependencyResolver 一起使用,但是使用自定义 IDependencyResolver 我可以捕获并记录 Autofac.Core.DependencyResolutionException 异常(这是真正有用的位)。

有谁知道是否有一种方法可以在不替换 AutofacWebApiDependencyResolver 的情况下实现类似的结果?

© www.soinside.com 2019 - 2024. All rights reserved.