asp.net-mvc - WebApi Action 过滤器调用了两次

标签 asp.net-mvc asp.net-web-api action-filter

我的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 .为什么?

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

最佳答案

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

代码应该是这样的:

// 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 足够聪明,即使已注册多次,也只能执行一次过滤器。此外,在某些情况下,您确实需要这样做。

关于asp.net-mvc - WebApi Action 过滤器调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18485479/

相关文章:

javascript - 如何修复 javascript .toFixed is not a Function 错误

jquery - Ajax场景下如何返回错误

asp.net-mvc - Angular JS Put 方法与 ASP.NET MVC

c# - Owin 自托管 WebApi Windows 身份验证和匿名

.net - ASP.NET MVC - 临时要求除一页之外的整个站点授权的简便方法

jquery - 当 jquery post 未触发 asp.net mvc Controller 操作时,调试的最佳方法是什么

asp.net - 如何从 ASP.NET Web API 方法内部找到声明的内容?

c# - 在一个解决方案中的两个项目中使用Ninject,出现循环依赖异常

c# - ASP.NET Core 的 ActionFilterAttribute 中的异步 OnActionExecuting

asp.net-mvc - 如何将自动映射器用于具有 IEnumerable<T> 属性的 ViewModel