2009-01-26 26 views
16

Supongamos que estoy tratando con un servicio que implica el envío de grandes cantidades de datos.WCF Service Throttling

Si implemento esto con WCF, ¿WCF acelerará el servicio en función de la cantidad de memoria que tarda cada solicitud en atender? ¿O recibiré continuas excepciones de memoria cada vez que reciba una gran cantidad de visitas a mi servicio?

estoy bastante curioso en cuanto a hacer frente a este problema fuera del WCF, estoy todavía un poco nuevo en el desarrollo de servicios ...

+0

Cualquier aplicación .NET puede generar una excepción OutOfMemory. También me gustaría ver servidores de ejecución inteligentes algún día, pero parece que eso requeriría otra capa de comunicación entre la aplicación y el host. Si valió la pena, probablemente ya existiría para los servicios de Windows. –

Respuesta

12

Al utilizar los atributos de encuadernación y readerQuotas como Andrew Hare sugiere que permitirán esencialmente un tamaño ilimitado para la mayoría de los usos prácticos, tenga en cuenta que se encontrará con otros problemas como tiempos de espera si acepta un comando de larga ejecución, no importa cómo se construye ese servicio (usando WCF o no).

Independientemente del tamaño de su mensaje, el servicio WCF deberá ser acelerado para que no se inunde. Si lo está alojando en IIS o WAS, tendrá características integradas adicionales para esos entornos de alojamiento que harán que su servicio sea mucho más "altamente disponible". Sin embargo, aún necesita prestar atención a los problemas de concurrencia. La siguiente configuración de WCF proporciona un ejemplo de configuración de algunos valores de aceleración.

<system.serviceModel> 

    ... 

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

Exactamente lo que estoy buscando. Imagino que pasaremos por una fase de ajuste después de reducir el uso de memoria por llamada tanto como sea posible :). Excelente respuesta – Spence

3

WCF tiene un límite de tamaño de carga útil por defecto que se rechacen los mensajes que más de una cierta cantidad de bytes. Esto es configurable, por supuesto, en la sección de enlace de su archivo de configuración. Aquí es un ejemplo crudo con un basicHttpBinding mostrando que muchos de los atributos disponibles para usted:

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

La idea es que se pueden crear muchas ediciones diferentes que se pueden utilizar para diferentes escenarios. Esto es bueno ya que puede ajustar cómo se consumen sus servicios y solo aumentar el límite de tamaño de mensaje para los puntos finales que los necesitan.

+0

Entiendo a qué te refieres, pero si pudiera controlar el tamaño de los mensajes, lo haría. Tengo que amar las imágenes. – Spence

3

Si está utilizando NetTcpBinding o NetNamedPipeBinding se puede utilizar la propiedad MaxConnections:

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

Esto es aplicable a mí, entonces +1, pero EnocnRoll La respuesta fue muy clara. Quizás la próxima vez :(. – Spence

+0

Sí, solo estaba ampliando un poco su respuesta :) –