Pregunta

Supongamos que estoy tratando con un servicio que implica enviar grandes cantidades de datos.

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

Tengo mucha curiosidad por tratar este problema fuera de WCF, todavía soy un poco nuevo en el desarrollo de servicios ...

¿Fue útil?

Solución

Si bien utiliza los atributos de enlace y el lector Las cuotas, como sugiere Andrew Hare, 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 ejecución prolongada, sin importar cómo se construye ese servicio (usando WCF o no).

No importa cuál sea el tamaño de su mensaje, el servicio WCF necesitará ser acelerado para el rendimiento para que no se inunde. Si lo aloja en IIS o WAS, tendrá características incorporadas adicionales para esos entornos de alojamiento que harán que su servicio sea mucho más & Quot; altamente disponible & Quot ;. Sin embargo, aún debe 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>

Otros consejos

WCF tiene un límite de tamaño de carga útil predeterminado que rechazará los mensajes en un determinado número de bytes. Esto es configurable, por supuesto, en la sección de enlace de su archivo de configuración. Aquí hay un ejemplo crudo con un basicHttpBinding que le muestra 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 puede crear muchos enlaces diferentes que puede usar 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.

Si está utilizando NetTCPBinding o NetNamedPipeBinding, puede usar la propiedad MaxConnections:

<bindings>
  <netTcpBinding>
    <binding name="myTCPBinding" maxConnections="15"/>
  </netTcpBinding>
</bindings>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top