My WebApi filter method OnActionExecuted
is being called twice.
My filter (I make it as simple as possible):
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();
}
}
My setup:
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());
}
}
In debugger I catch OnActionExecuted
twice with the same actionExecutedContext
. Why?
UPD
Controller
public class BankSmsController : ApiController
{
[AcceptVerbs(HttpVerbs.Get)]
public int GetTest()
{
return 1;
}
}
For me, I had specified the filter twice. In my IOC config file I had
And then in filterConfig I had
I removed the line from filterConfig and everything was better.
I have a suspicion, that this strange behavior can be fixed by either overriding
AllowMultiple
property of filter and returning false, or applyingAttributeUsage
attribute withAllowMultiple
set to false too (this influences on default implementation ofAllowMultiple
property of filter.At least in our project this helped (we have filters injected via Autofac).
This might be caused due to a registration of a custom filter provider. When you do this, you need to unregister the default one. Otherwise, if you are getting the usual filters in your custom one, they will be registered twice and consequently, executed twice.
Code should be something like this:
As have been said, AllowMultiple to false is a hack since .net is clever enough to only execute once a filter even if it has been registered several times. Also, there are scenarios where you do need this to be true.