Pergunta

Vamos supor que eu estou lidando com um serviço que envolve o envio de grandes quantidades de dados.

Se eu implementar isso com WCF, vai WCF acelerador o serviço baseado em quanta memória cada pedido leva a servir? Ou eu vou estar saindo contínuo de exceções de memória cada vez que eu receber um grande número de visitas ao meu serviço?

Estou muito curioso para saber lidar com isso fora problema do WCF, eu ainda sou um pouco novo para o desenvolvimento de serviços ...

Foi útil?

Solução

Enquanto estiver usando os atributos de ligação e ReaderQuotas como Andrew Hare sugere permitirá essencialmente um tamanho ilimitado para a maioria dos usos práticos, tenha em mente que o que você vai correr em outras questões, como o tempo limite se você aceitar um comando de longa duração, não importa como esse serviço é construído (usando WCF ou não).

Não importa o tamanho da sua mensagem é, o serviço WCF terá de ser estrangulada para o desempenho de modo que não é inundado. Se você está hospedando-o no IIS ou WAS, você terá recursos adicionais internos para esses ambientes de hospedagem que vão fazer o seu serviço muito mais "altamente disponível". No entanto, você ainda precisa prestar atenção a problemas de concorrência. A seguinte configuração WCF fornece um exemplo de configuração de alguns valores de estrangulamento.

   <system.serviceModel>

    ...

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

Outras dicas

WCF tem um limite de tamanho de carga padrão que irá rejeitar mensagens sobre um determinado número de bytes. Isso é configurável é claro na seção ligação do seu arquivo de configuração. Aqui está um exemplo bruto com um basicHttpBinding mostrando-lhe muitos dos atributos disponíveis para você:

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

A idéia é que você pode criar muitas ligações diferentes que você pode usar para diferentes cenários. Isso é bom, como você pode ajustar como seus serviços são consumidos e só aumentar o limite de tamanho da mensagem para os parâmetros que precisam deles.

Se você estiver usando NetTcpBinding ou NetNamedPipeBinding você pode usar a propriedade MaxConnections:

<bindings>
  <netTcpBinding>
    <binding name="myTCPBinding" maxConnections="15"/>
  </netTcpBinding>
</bindings>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top