2013-08-28 15 views
8

Meine WebApi-Filtermethode OnActionExecuted wird zweimal aufgerufen. Mein Filter (ich mache es so einfach wie möglich):WebApi Aktionsfilter zweimal aufgerufen

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(); 
     } 
    } 

Mein 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 OnActionExecuted zweimal mit dem gleichen actionExecutedContext fangen. Warum?

UPD

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

Ich bemerkte, dass ein "Inject" -Attribut auskommentiert wurde - könnte es eine NInject-Konfiguration geben, die auch Filter einrichtet, so dass sie zweimal hinzugefügt wird? Haben Sie bestätigt, dass nur eine Instanz des Filters in der globalen Filtersammlung vorhanden ist, nachdem der Startup-Code vollständig ausgeführt wurde? – levelnis

+0

Kein Ninject überhaupt. Ich entferne 'kernel.BindFilter (FilterScope.Global, 1);' –

+0

können Sie den Controller anzeigen? –

Antwort

8

Ich habe den Verdacht, dass dieses seltsame Verhalten entweder durch zwingende AllowMultiple Eigenschaft des Filters festgelegt werden kann und die Rückkehr falsch, oder die Anwendung AttributeUsage Attribut mit AllowMultiple Satz auf false zu (diese Einflüsse auf Standard-Implementierung von AllowMultiple Eigenschaft des Filters

Zumindest in unserem Projekt geholfen (wir haben Filter über Autofac injiziert).

+1

das hat bei mir funktioniert! –

+6

Die Verwendung von 'AllowMultiple' ist eher wie ein Hack, etwas registriert den Aktionsfilter zweimal. –

+0

@DanielLittle, das ist die richtige Bemerkung. –

2

Dies kann auf eine Registrierung eines benutzerdefinierten Filteranbieters zurückzuführen sein. Wenn Sie dies tun, müssen Sie die Standard Registrierung aufheben. Andernfalls, wenn Sie die üblichen Filter in Ihrem benutzerdefinierten Filter erhalten, werden sie zweimal registriert und folglich zweimal ausgeführt.

-Code sollte wie folgt sein:

// 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)); 

Wie gesagt worden, AllowMultiple auf false ist ein Hack, da .net nur ausführen klug genug ist, einmal einen Filter, auch wenn es mehrmals registriert wurde. Außerdem gibt es Szenarien, in denen dies erforderlich ist, um wahr zu sein.

+0

Danke für diesen Code, aber ich konnte FilterProvider nicht finden mit ActionDesctiptorFilterProvider geben Sie es mir Fehler Sequenz enthält kein passendes Element –

1

Für mich hatte ich den Filter zweimal angegeben. In meiner IOC Config-Datei hatte ich

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

Und dann in filterConfig hatte ich

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

ich die Linie von filterConfig entfernt und alles war besser.

Verwandte Themen