使用ASP进行统一属性拦截.. NET Web Api

本文关键字:NET Web Api 属性 ASP 使用 | 更新日期: 2023-09-27 18:17:36

我试图使用Unity通过属性对我的ApiController方法应用调用处理程序,但调用处理程序从未被调用。

属性:

public class LogAttribute : HandlerAttribute
{
    private readonly int _order;
    public LogAttribute(int order)
    {
        _order = order;
    }
    public override ICallHandler CreateHandler(Microsoft.Practices.Unity.IUnityContainer container)
    {
        return new LoggingCallHandler
        { 
            Order = _order
        };
    }
}

调用处理程序:

  public class LoggingCallHandler : ICallHandler
    {
        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
          //.....stuff   
        }
    }
注册:

container.AddNewExtension<Interception>();
container.RegisterType<IMyApiController>();
container.Configure<Interception>()
     .SetInterceptorFor<IMyApiController>(new InterfaceInterceptor());

依赖解析器(使用webactivatorex):

public static class UnityWebApiActivator
{
    public static void Start() 
    {            
        var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer());
        GlobalConfiguration.Configuration.DependencyResolver = resolver;
    }
}

使用ASP进行统一属性拦截.. NET Web Api

Web API系统将使用依赖解析器来解析控制器类(例如MyApiController),而不是该控制器类实现的接口(例如IMyApiController)。我不知道有什么方法可以让Web API系统请求这个接口(而且我怀疑是否有这样的方法)。

一个解决方案是拦截控制器本身(MyApiController),但由于它是一个类,您不能使用接口拦截器(InterfaceInterceptor),而是必须使用像这样的虚拟方法拦截器:

container.Configure<Interception>()
     .SetInterceptorFor<MyApiController>(new VirtualMethodInterceptor());

这将要求您创建想要拦截virtual的操作方法。

请注意,你仍然可以拦截其他依赖注入到你的控制器(定义为接口)通过InterfaceInterceptor。这是因为Web API系统会要求容器将它们解析为接口,而不是类。