C# 在WebAPI中使用自定义IHttpActionInvoker进行异常处理
我正在尝试向我的WebAPI应用程序添加一个自定义IHttpActionInvoker,以防止在我的操作方法中需要大量重复的异常处理代码 除此之外,关于如何做到这一点,似乎真的没有太多。在根据文章编写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
GlobalConfiguration.Configuration.Services.Remove(typeof(IHttpActionInvoker),
GlobalConfiguration.Configuration.Services.GetActionInvoker());
GlobalConfiguration.Configuration.Services.Add(typeof(IHttpActionInvoker),
new MyApiControllerActionInvoker());
进入我的Global.asax文件中的方法。现在,当执行对我的API的调用时,我在Remove()方法中引发了以下异常:
我想我有两个问题
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");
}
}
}