使用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;
}
}
Web API系统将使用依赖解析器来解析控制器类(例如MyApiController
),而不是该控制器类实现的接口(例如IMyApiController
)。我不知道有什么方法可以让Web API系统请求这个接口(而且我怀疑是否有这样的方法)。
一个解决方案是拦截控制器本身(MyApiController
),但由于它是一个类,您不能使用接口拦截器(InterfaceInterceptor
),而是必须使用像这样的虚拟方法拦截器:
container.Configure<Interception>()
.SetInterceptorFor<MyApiController>(new VirtualMethodInterceptor());
这将要求您创建想要拦截virtual
的操作方法。
请注意,你仍然可以拦截其他依赖注入到你的控制器(定义为接口)通过InterfaceInterceptor
。这是因为Web API系统会要求容器将它们解析为接口,而不是类。