在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
我想我有两个问题。
  1. 考虑到没有看到有很多关于编写自定义IHttpActionInvoker类,这被认为是解决WebAPI应用程序异常处理的好方法吗?

  2. 有没有人知道为什么我在执行Remove()方法时会得到这样的异常,以及如何最好地解决这个特定的问题?

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

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

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

例如,我使用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");
        }
    }
}
相关文章:
  • 没有找到相关文章