Возвращение больших коллекций из WCF Serivce - PullRequest
1 голос
/ 07 мая 2010

Я пытаюсь определить лучший подход для создания службы WCF, и область, с которой я больше всего борюсь, - это возвращение списков объектов.

Встроенный maxMessageSize 64k кажется довольно высоким,и я действительно не хочу увеличивать его (быстрое поиск в Google находит сотни мест, увеличивающих maxMessageSize до диапазона в несколько гигабайт, что кажется глупым).Но когда я возвращаю коллекцию объектов (~ 150 элементов), я превышаю значение по умолчанию на 64 тыс.

Я почти на грани возвращения своего собственного класса, который наследует IEnumerable и имеет свойства для hasNext,hasPrevious и PageSize, так что я могу реализовать пейджинг на стороне клиента - это выглядит как много кода.Другой вариант - поднять maxMessageSize и надеяться на лучшее, но это не так.

Все остальные аспекты моего сервиса работают отлично, он просто возвращает большую коллекцию, где у меня возникают проблемы.

Для справки, есть два типа потребителей этой услуги, приложения пользовательского интерфейса, которыеэто будут веб-приложения и / или приложения wpf, приложения для обработки данных, консольные приложения .NET и, возможно, некоторые другие приложения, не относящиеся к пользовательскому интерфейсу.Для приложений пользовательского интерфейса я хотел бы, чтобы они отвечали на запросы и оставляли размер messageSize на низком уровне, для консольных приложений это не так важно, поскольку они просто собирают данные для обработки и возвращают их обратно в службу.

Ответы [ 2 ]

3 голосов
/ 07 мая 2010

Я полагаю, что причина, по которой значение по умолчанию для maxMessageSize является настолько низким, заключается в снижении риска DoS-атак.

Если ответные сообщения большие, то для конфигурации client требуется увеличение maxMessageSize. Для клиента DoS вряд ли представляет риск, поэтому безопасно увеличить его до очень большого значения.

Но это не «взвинчивание maxMessageSize и надежда на лучшее» - вы должны решить, какой максимальный размер будет для вашего приложения, принимая во внимание, решите ли вы использовать пейджинг или настроить его соответствующим образом.

На сервере maxMessageSize должно быть достаточно большим для максимально разрешенного запроса сообщения. Здесь DoS является потенциальной проблемой, хотя в некоторых средах (например, в интрасети), вероятно, безопасно использовать очень большое значение.

Если ваша служба предоставляет операцию, которая позволяет клиенту запрашивать потенциально большой набор данных, альтернативный подход к поисковому вызову состоит в определении максимального количества элементов, которые клиент может запросить за один вызов.

Например, у вас может быть операция, которая позволяет клиенту запрашивать курсы валют для списка валют и диапазона дат:

public IList<ExchangeRate> GetExchangeRates(string baseCurrency, IList<string> currencies, DateTime startDate, DateTime endDate);

Затем вы можете установить ограничение на количество результатов, которое будет возвращать ваша служба, и предоставить это клиенту:

public int GetMaximumResultCount();

После этого клиент должен будет запросить GetMaximumResultCount и убедиться, что:

(endDate - startDate).TotalDays * currencies.Count < maximumResultCount

Если клиент не соблюдает это, сервер выбрасывает подходящий FaultException

0 голосов
/ 07 мая 2010

Вы можете использовать MTOM Message Enconding .Это альтернатива Stream при отправке больших данных.Вот пример конфигурации:

 <system.serviceModel>
     …
    <bindings>
      <wsHttpBinding>
        <binding name="ExampleBinding" messageEncoding="Mtom"/>
      </wsHttpBinding>
    </bindings>
     …
<system.serviceModel>

Просто установите для атрибута messageEncoding значение Mtom в конфигурации привязки .Кроме того, измените maxReceivedMessageSize и maxBufferSize .

A How To Here и дополнительную информацию текст ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...