C# 在WebAPI中使用自定义IHttpActionInvoker进行异常处理

C# 在WebAPI中使用自定义IHttpActionInvoker进行异常处理,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我正在尝试向我的WebAPI应用程序添加一个自定义IHttpActionInvoker,以防止在我的操作方法中需要大量重复的异常处理代码 除此之外,关于如何做到这一点,似乎真的没有太多。在根据文章编写IHttpActionInvoker之后,我添加了以下代码: GlobalConfiguration.Configuration.Services.Remove(typeof(IHttpActionInvoker), GlobalConfiguration.Configuration.Service

我正在尝试向我的WebAPI应用程序添加一个自定义IHttpActionInvoker,以防止在我的操作方法中需要大量重复的异常处理代码

除此之外,关于如何做到这一点,似乎真的没有太多。在根据文章编写IHttpActionInvoker之后,我添加了以下代码:

GlobalConfiguration.Configuration.Services.Remove(typeof(IHttpActionInvoker),
GlobalConfiguration.Configuration.Services.GetActionInvoker());

GlobalConfiguration.Configuration.Services.Add(typeof(IHttpActionInvoker),
new MyApiControllerActionInvoker());
进入我的Global.asax文件中的方法。现在,当执行对我的API的调用时,我在Remove()方法中引发了以下异常:

我想我有两个问题

  • 考虑到编写自定义IHttpActionInvoker类的可能性不大,这被认为是解决WebAPI应用程序中异常处理的好方法吗

  • 有人知道为什么我在执行
    Remove()
    方法时会遇到这样的异常,以及如何最好地解决这个问题吗


  • 您是否考虑过注册一个异常过滤器?以下是一些关于这方面的文档:


    如果您只想以特定的方式处理某些异常,就不必求助于action invoker层。

    我遇到了与您在尝试删除服务时描述的相同的错误

    我发现我不需要从全局配置中删除任何内容,因为如果您已经在容器中注册了接口,那么它会首先解决这个问题

    例如,我正在使用SimpleInjector,在我的global.asax中,我有:

    container.Register<IHttpActionInvoker , MyApiControllerActionInvoker >();
    // Register the dependency resolver.
    GlobalConfiguration.Configuration.DependencyResolver =
       new SimpleInjectorWebApiDependencyResolver(container);
    

    就我而言,它与IActionInvoker而不是IHTTPacationnvoker一起工作。据我所知,IHttpActionInvoker用于异步api调用,不是吗

    public class RepControllerActionInvoker : ControllerActionInvoker
    {
        ILogger _log;
    
        public RepControllerActionInvoker()
            : base()
        {
            _log = DependencyResolver.Current.GetService<ILogger>();
        }
    
        public override bool InvokeAction(ControllerContext controllerContext, string actionName)
        {
            try
            {
                return base.InvokeAction(controllerContext, actionName);
            }
            catch (Exception e)
            {
                _log.Error(e);
                throw new HttpException(500, "Internal error");
            }
        }
    }
    
    公共类RepControllerActionInvoker:ControllerActionInvoker
    {
    ILogger_日志;
    公共RepControllerActionInvoker()
    :base()
    {
    _log=DependencyResolver.Current.GetService();
    }
    公共覆盖布尔调用操作(ControllerContext ControllerContext,string actionName)
    {
    尝试
    {
    返回base.InvokeAction(controllerContext,actionName);
    }
    捕获(例外e)
    {
    _日志错误(e);
    抛出新的HttpException(500,“内部错误”);
    }
    }
    }
    
    开发人员想要捕获的许多异常都通过Web API转换为
    HttpResponseException
    。这个异常在调用异常过滤器之前很久就被吞没了,所以全局异常过滤器不会捕获所有内容。
    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionInvoker), new MyApiControllerActionInvoker(fooService));
    
    public class RepControllerActionInvoker : ControllerActionInvoker
    {
        ILogger _log;
    
        public RepControllerActionInvoker()
            : base()
        {
            _log = DependencyResolver.Current.GetService<ILogger>();
        }
    
        public override bool InvokeAction(ControllerContext controllerContext, string actionName)
        {
            try
            {
                return base.InvokeAction(controllerContext, actionName);
            }
            catch (Exception e)
            {
                _log.Error(e);
                throw new HttpException(500, "Internal error");
            }
        }
    }