Ограничить фильтр OData $ по свойству в Web API - PullRequest
0 голосов
/ 27 августа 2018

Я хочу разрешить использование только некоторых свойств в опции OData $filter.

Я вижу, что есть AllowedOrderByProperties параметр для EnableQueryAttribute, но я не нашел другого для $ filter. Я только что пропустил это? Если нет, что потребуется для его реализации?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы можете попробовать следующее:

Когда у вас есть строитель, вы можете перечислить свойства набора сущностей, а затем указать, является ли поле фильтруемым.

var entityTypeConfig = builder.EntitySet<SomeType>("SomeType").EntityType;
entityTypeConfig.Property(x => x.SomeField);
entityTypeConfig.Property(x => x.SomeField2).IsNotFilterable().IsNonFilterable();
// not sure what is the difference between them

и в действии контроллера (например, httpGet) добавьте

options.Filter.Validate(allowedOptions);

в случае, если поле не может быть отфильтровано, возникнет исключение.

0 голосов
/ 28 августа 2018

Я думаю, что вы собираетесь использовать собственную проверку фильтра, поскольку нет встроенного языка для того, что вы фильтруете. Это может или не может быть полезным для вас, но я бы порекомендовал использовать ModelBinder для выполнения вашей проверки, поэтому, когда ваши методы контроллера запущены, вы уже проверили содержимое всех параметров. Я бы предложил вернуть из вашего ModelBinder объект, который соответствует вашим бизнес-потребностям в вашем приложении. Вы можете, конечно, использовать конструкции OData, чтобы помочь вам сделать это. Вот фрагмент кода из нашей системы, который запускает этот процесс. Это может быть полезно, чтобы вы пошли на свой собственный Binder.

private T CreateQueryOptions<T>(string url, [CallerMemberName] string caller = null) where T : class
{
    var httpRequest = new HttpRequestMessage(HttpMethod.Get, url);
    ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
    modelBuilder.EntitySet<T>(caller);
    var odata =  new ODataQueryOptions<T>(new ODataQueryContext(modelBuilder.GetEdmModel(), typeof(T)), httpRequest);
    // rest of your code here to validate OData parameters  Generics may not be appropriate for you.
}

Но это works for me в реальной системе с сотнями миллионов вызовов / день.

...