8

WebApi フィルター メソッドOnActionExecutedが 2 回呼び出されています。私のフィルター(できるだけシンプルにします):

   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デバッガーでは、同じで 2 回キャッチしますactionExecutedContext。なんで?

UPD

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

3 に答える 3

8

この奇妙な動作はAllowMultiple、フィルターのプロパティをオーバーライドして false を返すか、AttributeUsage属性をfalse に設定して適用することで修正できるのではないかと疑っています (これは、フィルターのプロパティのAllowMultipleデフォルトの実装に影響します。AllowMultiple

少なくとも私たちのプロジェクトではこれが役に立ちました (Autofac を介して挿入されたフィルターがあります)。

于 2014-02-11T17:52:50.203 に答える
3

これは、カスタム フィルター プロバイダーの登録が原因である可能性があります。これを行うときは、デフォルトの登録を解除する必要があります。それ以外の場合、カスタム フィルターで通常のフィルターを取得している場合、それらは 2 回登録され、その結果、2 回実行されます。

コードは次のようになります。

// 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 に設定するのはハックです。なぜなら、.net はフィルターが複数回登録されていても 1 回しか実行しないほど賢いからです。また、これが真である必要があるシナリオもあります。

于 2015-10-15T10:11:12.803 に答える
2

私の場合、フィルターを 2 回指定しました。私のIOC設定ファイルには

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

そして、filterConfigで私が持っていた

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

filterConfig から行を削除したところ、すべてが改善されました。

于 2016-02-15T20:55:16.307 に答える