Domanda

Supponiamo che abbia a che fare con un servizio che prevede l'invio di grandi quantità di dati.

Se lo implemento con WCF, WCF limiterà il servizio in base alla quantità di memoria necessaria per ogni richiesta? O avrò continuamente continue eccezioni di memoria ogni volta che riceverò un gran numero di hit al mio servizio?

Sono abbastanza curioso di affrontare questo problema al di fuori di WCF, sono ancora un po 'nuovo nello sviluppo del servizio ...

È stato utile?

Soluzione

Mentre utilizzi gli attributi e il lettore di associazioneQuotas come suggerisce Andrew Hare consentiranno essenzialmente una dimensione illimitata per la maggior parte degli usi pratici, tieni presente che ti imbatterai in altri problemi come i timeout se accetti un comando di lunga durata, non importa come viene costruito quel servizio (usando o meno WCF).

Indipendentemente dalle dimensioni del messaggio, il servizio WCF dovrà essere limitato per le prestazioni in modo che non venga inondato. Se lo stai ospitando in IIS o WAS, avrai funzionalità integrate aggiuntive a quegli ambienti di hosting che renderanno il tuo servizio molto più & Quot; altamente disponibile & Quot ;. Tuttavia, è ancora necessario prestare attenzione ai problemi di concorrenza. La seguente configurazione WCF fornisce un esempio di impostazione di alcuni valori di limitazione.

   <system.serviceModel>

    ...

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

Altri suggerimenti

WCF ha un limite di dimensioni del payload predefinito che rifiuterà i messaggi su un determinato numero di byte. Questo è ovviamente configurabile nella sezione di associazione del file di configurazione. Ecco un esempio approssimativo con un basicHttpBinding che mostra molti di gli attributi a tua disposizione:

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

L'idea è che è possibile creare molti diversi vincoli che è possibile utilizzare per diversi scenari. È utile in quanto è possibile ottimizzare la modalità di utilizzo dei servizi e aumentare il limite delle dimensioni dei messaggi solo per gli endpoint che ne hanno bisogno.

Se stai usando NetTCPBinding o NetNamedPipeBinding puoi usare la proprietà MaxConnections:

<bindings>
  <netTcpBinding>
    <binding name="myTCPBinding" maxConnections="15"/>
  </netTcpBinding>
</bindings>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top