2013-08-28 30 views
8

Phương pháp lọc WebApi của tôi OnActionExecuted đang được gọi hai lần. lọc của tôi (tôi làm cho nó càng đơn giản càng tốt):Bộ lọc tác vụ WebApi được gọi hai lần

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

thiết lập của tôi:

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

Trong debugger tôi bắt OnActionExecuted hai lần với cùng actionExecutedContext. Tại sao?

UPD

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

Tôi nhận thấy một thuộc tính 'Tiêm' đã nhận xét - có thể có cấu hình NInject nào cũng thiết lập bộ lọc để nó được thêm hai lần không? Bạn đã xác nhận rằng chỉ có một thể hiện của bộ lọc trong bộ sưu tập bộ lọc toàn cục sau khi tất cả mã khởi động đã kết thúc chạy? – levelnis

+0

Không có ninject nào cả. Tôi loại bỏ 'kernel.BindFilter (FilterScope.Global, 1);' –

+0

bạn có thể hiển thị bộ điều khiển không? –

Trả lời

8

Tôi có một nghi ngờ, rằng hành vi kỳ lạ này có thể được cố định bởi một trong hai trọng AllowMultiple tài sản của bộ lọc và trả về false, hoặc áp dụng AttributeUsage thuộc tính với AllowMultiple thiết lập để sai quá (điều này ảnh hưởng về việc triển khai mặc định thuộc tính AllowMultiple của bộ lọc

Ít nhất trong dự án của chúng tôi, điều này đã giúp (chúng tôi có các bộ lọc được tiêm qua Autofac)

+1

điều này làm việc cho tôi! –

+6

Sử dụng 'AllowMultiple' giống như một hack, một cái gì đó đang đăng ký bộ lọc hành động hai lần. –

+0

@DanielLittle, đây là nhận xét đúng. –

2

Điều này có thể do việc đăng ký nhà cung cấp bộ lọc tùy chỉnh. Khi bạn làm điều này, bạn cần phải hủy đăng ký mặc định. Nếu không, nếu bạn đang nhận được các bộ lọc thông thường trong một tùy chỉnh của bạn, chúng sẽ được đăng ký hai lần và do đó, được thực thi hai lần.

Mã nên một cái gì đó như thế này:

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

Như đã nói, AllowMultiple false là một hack từ .net là đủ thông minh để chỉ thực hiện một lần một bộ lọc ngay cả khi nó đã được đăng ký nhiều lần. Ngoài ra, có những tình huống mà bạn cần điều này là đúng.

+0

Cảm ơn mã này nhưng tôi không thể tìm thấy FilterProvider với loại ActionDesctiptorFilterProvider nó cung cấp cho tôi lỗi Sequence không chứa phần tử phù hợp –

1

Đối với tôi, tôi đã chỉ định bộ lọc hai lần. Trong tập tin cấu hình IOC của tôi, tôi đã

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

Và sau đó trong filterConfig tôi đã

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

tôi loại bỏ các dòng từ filterConfig và tất cả mọi thứ đã tốt hơn.

Các vấn đề liên quan