Подтвердить что ты не робот

Дросселирование службы WCF

Предположим, что я имею дело со службой, которая включает отправку больших объемов данных.

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

Мне очень любопытно иметь дело с этой проблемой за пределами WCF, я все еще немного новичок в разработке сервисов...

4b9b3361

Ответ 1

Используя атрибуты привязки и readerQuotas, такие как предложения Andrew Hare, позволят использовать практически неограниченный размер для большинства практических применений, имейте в виду, что вы столкнетесь с другими проблемами, такими как таймауты, если вы принимаете длительную команду, независимо от того, как эта служба построена (используя WCF или нет).

Независимо от размера вашего сообщения, служба WCF должна быть дросселирована для производительности, чтобы она не была затоплена. Если вы размещаете его в IIS или WAS, у вас будут дополнительные встроенные функции в тех средах хостинга, которые сделают ваш сервис намного более "доступным". Однако вам все равно нужно обратить внимание на проблемы concurrency. Следующая конфигурация WCF предоставляет пример установки некоторых значений дросселирования.

   <system.serviceModel>

    ...

     <behaviors>
       <serviceBehaviors>
         <behavior name="GenericServiceBehavior">
           <serviceTimeouts transactionTimeout="00:09:10"/>
           <serviceThrottling
             maxConcurrentCalls="20"
             maxConcurrentSessions="20"
             maxConcurrentInstances="20"
           />
         </behavior>
       </serviceBehaviors>
     </behaviors>
   </system.serviceModel>

Ответ 2

WCF имеет ограничение по умолчанию для размера полезной нагрузки, которое будет отклонять сообщения по определенному количеству байтов. Это, конечно, настраивается в разделе привязки вашего файла конфигурации. Вот грубый пример с basicHttpBinding, показывающий вам множество доступных вам атрибутов:

<bindings>
    <basicHttpBinding>
        <binding name="testBinding" maxReceivedMessageSize="2147483647">
            <readerQuotas
              maxDepth="2147483647"
              maxStringContentLength="2147483647"
              maxArrayLength="2147483647"
              maxBytesPerRead="2147483647"
              maxNameTableCharCount="2147483647" />
        </binding>
    </basicHttpBinding>

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

Ответ 3

Если вы используете NetTCPBinding или NetNamedPipeBinding, вы можете использовать свойство MaxConnections:

<bindings>
  <netTcpBinding>
    <binding name="myTCPBinding" maxConnections="15"/>
  </netTcpBinding>
</bindings>