Abbiamo un servizio WCF come servizio BL. Il servizio è in modalità Trasporto misto, ha più di 10 endpoint diversi, vincolati da BasicHttpBinding, con contratti diversi e lo stesso indirizzo per tutti loro. Il servizio viene eseguito sul relativo pool di applicazioni su IIS-7.Servizio WCF che raggiunge l'utilizzo di memoria elevata in prima chiamata
Il problema è che il servizio funziona bene, ma dopo la prima chiamata, anche l'ottenere il WSDL, l'utilizzo della memoria del w3wp.exe va dritto a 300 mega, l'utilizzo della memoria di servizio mantiene ad aumentare costantemente, presa in consegna tutta la memoria fisica del server (98 - 100%). Non abbiamo superato l'eccezione di memoria, ma questa situazione rallenta altre applicazioni e il servizio, quindi è necessario aggiornare manualmente il pool di applicazioni una volta ogni paio di giorni. Ho già provato a utilizzare lo strumento di profilatura della memoria e non ho trovato alcun indizio alla causa del problema.
Qualcuno ha riscontrato questo problema? e se sì, cosa hai fatto?
Ulteriori informazioni:
- Il servizio BL si trova sopra un quadro DAL base di NHibernate, abbiamo già escluso la perdita di memoria è originario da lì.
file di configurazione
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> </appSettings> <system.web> <compilation debug="true" targetFramework="4.0" /> <httpRuntime maxRequestLength="20000" requestLengthDiskThreshold="20000" /> </system.web> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="DefaultServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="AnonymousBehavior"> </behavior> </endpointBehaviors> </behaviors> <bindings> <basicHttpBinding> <binding name="SecureBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="true" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536000" maxBufferPoolSize="524288000" maxReceivedMessageSize="65536000" transferMode="Buffered"> <readerQuotas maxDepth="20000000" maxStringContentLength="8192000" maxArrayLength="16384000" maxBytesPerRead="4096000" maxNameTableCharCount="16384000" /> <security mode="None"> <transport clientCredentialType="None"/> </security> </binding> </basicHttpBinding> </bindings> <services> <service name="BL.Services.MyService" behaviorConfiguration="DefaultServiceBehavior"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureBinding" bindingNamespace="Security/Anonymous" behaviorConfiguration="WithSecurityContextInspector" contract="BL.Services.Contracts.IAnonymousClaimsService" /> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureBinding" bindingNamespace="Domain/App" behaviorConfiguration="WithSecurityContextInspector" contract="BL.Services.Contracts.IAppService" /> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureBinding" bindingNamespace="Domain/App" behaviorConfiguration="WithSecurityContextInspector" contract="BL.Services.Contracts.IAttachmentService" /> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureBinding" bindingNamespace="Domain/Site" behaviorConfiguration="WithSecurityContextInspector" contract="BL.Services.Contracts.ISecurityService" /> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureBinding" bindingNamespace="Domain/Transaction" behaviorConfiguration="WithSecurityContextInspector" contract="BL.Services.Contracts.ITransactionService" /> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureBinding" bindingNamespace="Domain/ActiveDirectory" behaviorConfiguration="WithSecurityContextInspector" contract="BL.Services.Contracts.IActiveDirectoryService" /> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecureBinding" bindingNamespace="Domain/Report" behaviorConfiguration="WithSecurityContextInspector" contract="BL.Services.Contracts.IReportService" /> <host> <baseAddresses> <add baseAddress="//MyService.svc" /> </baseAddresses> </host> </service> </services> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true" /> <defaultDocument> <files> <add value="MyService.svc" /> </files> </defaultDocument> </system.webServer> </configuration>
Ho avuto problemi di memoria con WCF che ha rifiutato di andare via. La documentazione intorno alla miriade di opzioni di configurazione per WCF è piuttosto scarsa IMO. Non sono mai arrivato al fondo e ho finito per scrivere il mio framework di remoting che mi ha rimesso in controllo del consumo di memoria. Spero che tu trovi una soluzione migliore. – spender
come è la tua configurazione? in particolare intorno all'opzione objectItemsInGraph ecc? Stai correndo contemporaneamente? Quante sessioni attive ecc. Stai permettendo? Tutti questi hanno un effetto. – Chris