ここで注意すべき点:
- フィルターは、アクションに対して次の順序で実行されます。グローバルに定義されたフィルター -> コントローラー固有のフィルター -> アクション固有のフィルター。
- 承認フィルター -> アクション フィルター -> 例外フィルター
現在、あなたが言及しているように見える問題は、同じ種類の複数のフィルターを持つことに関連しています (例:
ActionFilterAttribute
コントローラーまたはアクションで複数の装飾が施されています。これは、リフレクションに基づく順序を保証しない場合です)。この場合、 のカスタム実装を使用して Web API でそれを行う方法があります
System.Web.Http.Filters.IFilterProvider
。私は以下を試し、それを確認するためにいくつかのテストを行いました。それはうまくいくようです。試してみて、期待どおりに機能するかどうかを確認できます。
// Start clean by replacing with filter provider for global configuration.
// For these globally added filters we need not do any ordering as filters are
// executed in the order they are added to the filter collection
config.Services.Replace(typeof(IFilterProvider), new System.Web.Http.Filters.ConfigurationFilterProvider());
// Custom action filter provider which does ordering
config.Services.Add(typeof(IFilterProvider), new OrderedFilterProvider());
public class OrderedFilterProvider : IFilterProvider
{
public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
{
// controller-specific
IEnumerable<FilterInfo> controllerSpecificFilters = OrderFilters(actionDescriptor.ControllerDescriptor.GetFilters(), FilterScope.Controller);
// action-specific
IEnumerable<FilterInfo> actionSpecificFilters = OrderFilters(actionDescriptor.GetFilters(), FilterScope.Action);
return controllerSpecificFilters.Concat(actionSpecificFilters);
}
private IEnumerable<FilterInfo> OrderFilters(IEnumerable<IFilter> filters, FilterScope scope)
{
return filters.OfType<IOrderedFilter>()
.OrderBy(filter => filter.Order)
.Select(instance => new FilterInfo(instance, scope));
}
}
//NOTE: Here I am creating base attributes which you would need to inherit from.
public interface IOrderedFilter : IFilter
{
int Order { get; set; }
}
public class ActionFilterWithOrderAttribute : ActionFilterAttribute, IOrderedFilter
{
public int Order { get; set; }
}
public class AuthorizationFilterWithOrderAttribute : AuthorizationFilterAttribute, IOrderedFilter
{
public int Order { get; set; }
}
public class ExceptionFilterWithOrderAttribute : ExceptionFilterAttribute, IOrderedFilter
{
public int Order { get; set; }
}
于 2014-02-07T14:59:32.810 に答える