Limitazione del servizio WCF
-
20-08-2019 - |
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 ...
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>