2016-08-31 1 views
0

Я пишу веб-службу ASP.NET Web API 2 с помощью OdataControllers. Я узнал, как установить размер страницы, используя PageSize Свойство EnableQueryAttribute. Я хочу разрешить пользователям моей веб-службы устанавливать размер страницы в app.config, а затем попросить приложение прочитать этот параметр и установить размер страницы. Проблема в том, что для использования атрибута требуется, чтобы параметр «Размер страницы» был установлен на константу времени компиляции.Настройка результата OData Размер страницы во время выполнения в приложении WebAPI

Использование атрибута:

[EnableQuery(PageSize = 10)] 
public IHttpActionResult GetProducts() 
{ 
    return repo.GetProducts(); 
} 

Одно предложенное решение, которое я видел, чтобы построить EnableQueryAttribute и установить его на объекте HTTPConfiguration конфигурации, как этот

int customSize = ReadPageSizeSettingFromConfigFile(); 

var attr = new EnableQueryAttribute { PageSize = customSize }; 
config.AddODataQueryFilter(attr); 

, но это на самом деле не работает , Коллекция фильтра HttpConfiguration остается пустой.

config object watch view

Комментарий на другую должность (погребенной в списке комментариев) предложил убрать все EnableQuery атрибутов контроллеров, но это не имеет никакого эффекта либо. Поскольку атрибут EnableQuery заменил старый атрибут Queryable, мне интересно, является ли это проблемой Microsoft.

Этот вопрос был задан и не ответил раньше: How limit OData results in a WebAPI

Вся помощь очень ценится.

+0

немного запутанным. Пользователь делает запрос web-api, и вы хотите, чтобы этот запрос api изменил файл app.config? Вы уверены, что это хорошая идея? –

+0

Я расширил свой вопрос, чтобы уточнить. Я хочу прочитать значение из app.config и установить его во время выполнения. – cl0h

ответ

1

Вы можете использовать $ сверху и $ пропустить, чтобы достичь своей цели, если клиент хочет размер_страница 10, и хочет вторую страницу:

localhost/odata/Customers?$top=10&$skip=10 

О динамически установить размер_страницы:

public class MyEnableQueryAttribute : EnableQueryAttribute 
{ 
    public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions) 
    { 
     int pagesize = xxx; 
     var result = queryOptions.ApplyTo(queryable, new ODataQuerySettings { PageSize = pagesize }); 
     return result; 
    } 
} 

и поместите этот атрибут в свой метод контроллера.

+0

Я знаю синтаксис OData. Я хочу ограничить (по размеру страницы) количество клиентов данных ** разрешено ** запрашивать с сервера. – cl0h

+0

Готов, обновленный ответ –

+0

Это поставило меня на правильный путь. Благодарю. – cl0h

1

Вы можете установить конфигурации для MaxTop в webApiConfig методе resgister

public static class WebApiConfig{ 
     public static void Register(HttpConfiguration config){ 
      config.Select().Expand().Filter().OrderBy().MaxTop(100).count() // you can change max page size here 
     } 
}