在WebAPI中使用自定义IHttpActionInvoker进行异常处理
本文关键字:IHttpActionInvoker 异常处理 自定义 WebAPI | 更新日期: 2023-09-27 18:11:44
我正在尝试添加一个自定义IHttpActionInvoker到我的WebAPI应用程序,以防止在我的动作方法中需要大量重复的异常处理代码。
除了这篇文章之外,似乎没有太多关于如何做到这一点的内容。在根据文章编写IHttpActionInvoker后,我添加了以下代码:
GlobalConfiguration.Configuration.Services.Remove(typeof(IHttpActionInvoker),
GlobalConfiguration.Configuration.Services.GetActionInvoker());
GlobalConfiguration.Configuration.Services.Add(typeof(IHttpActionInvoker),
new MyApiControllerActionInvoker());
放入全局中的方法中。asax文件。现在,当执行对我的API的调用时,我在Remove()方法中得到以下异常:
The service type IHttpActionInvoker is not supported
我想我有两个问题。
考虑到没有看到有很多关于编写自定义IHttpActionInvoker类,这被认为是解决WebAPI应用程序异常处理的好方法吗?
有没有人知道为什么我在执行
Remove()
方法时会得到这样的异常,以及如何最好地解决这个特定的问题?
我在试图删除服务时遇到了与您描述的相同的错误。
我发现我不需要从全局配置中删除任何东西,因为如果你已经在容器中注册了接口,那么它将首先解决这个问题。
例如,我使用SimpleInjector和在我的全局。如果我有这个:
container.Register<IHttpActionInvoker , MyApiControllerActionInvoker >();
// Register the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
在运行时,它会在需要时解析MyApiControllerActionInvoker依赖项。
然后你可以在你的客户ActionInvoker中执行异常处理,并且在构造函数中设置的任何依赖项都将被正确地连接起来。我查看ActionInvoker的原因是为了获得构造函数注入,因为注入属性似乎需要属性注入。
也比删除/插入,替换似乎工作。(在Global.asax)
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionInvoker), new MyApiControllerActionInvoker(fooService));
您考虑过注册一个异常过滤器吗?这里有一些关于它的文档:
http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling如果你想做的只是以一种特定的方式处理一些异常,你不应该落到动作调用者层。
对于我来说,它与IActionInvoker而不是IHttpActionInvoker一起工作。据我所知,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");
}
}
}