我的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/