8

我的 WebApi 过滤器方法OnActionExecuted被调用了两次。我的过滤器(我让它尽可能简单):

   public class NHibernateActionFilter : ActionFilterAttribute
   { 
        //  [Inject]
        //   public ISessionFactoryProvider sessionFactoryProvider { get; set; }
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
           var a = 5;
           var b = a;
           //new BaseSessionProvider(sessionFactoryProvider).EndContextSession();
        }
    }

我的设置:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        //http://stackoverflow.com/questions/9521040/how-to-add-global-asp-net-web-api-filters
        FilterConfig.RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
    }

    public class FilterConfig
    {

        public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
        {
             filters.Add(new NHibernateActionFilter());
        }
     }

在调试器中,我OnActionExecuted用相同的actionExecutedContext. 为什么?

UPD

Controller
public class BankSmsController : ApiController
{
         [AcceptVerbs(HttpVerbs.Get)]
         public int GetTest()
         {
             return 1;
         }
}
4

3 回答 3

8

我怀疑,这种奇怪的行为可以通过覆盖AllowMultiple过滤器的属性并返回 false 或应用设置为 false 的AttributeUsage属性来修复AllowMultiple(这会影响AllowMultiple过滤器属性的默认实现。

至少在我们的项目中这有所帮助(我们通过 Autofac 注入了过滤器)。

于 2014-02-11T17:52:50.203 回答
3

这可能是由于注册了自定义过滤器提供程序造成的。执行此操作时,您需要取消注册默认值。否则,如果您在自定义过滤器中获得常用过滤器,它们将被注册两次,因此执行两次。

代码应该是这样的:

// remove default action filter provider
var defaultFilterProvider = config.Services.GetFilterProviders().Single(provider => provider is ActionDescriptorFilterProvider);
config.Services.Remove(typeof(IFilterProvider), defaultFilterProvider);

// add custom filter provider
config.Services.Add(typeof(IFilterProvider), new CustomFilterProvider(container));

如前所述,将 AllowMultiple 设置为 false 是一种 hack,因为 .net 足够聪明,即使已注册多次,也只能执行一次过滤器。此外,在某些情况下,您确实需要这样做。

于 2015-10-15T10:11:12.803 回答
2

对我来说,我已经指定了两次过滤器。在我的 IOC 配置文件中

builder.Register(c => new SelectListFilter(c.Resolve<ClientManager>()))
        .AsActionFilterFor<Controller>()
        .InstancePerRequest();
        .RegisterFilterProvider();

然后在 filterConfig 我有

filters.Add(DependencyResolver.Current.GetService<IActionFilter>());

我从 filterConfig 中删除了该行,一切都变得更好了。

于 2016-02-15T20:55:16.307 回答