WCF Streaming großer Datenmengen (500 MB / 1 GB) auf einem selbst gehosteten Dienst
Ich bin derzeit ein Problem aufgetreten ist, versuchen, das senden von großen Daten mithilfe von WCF-self-hosted-service (ohne IIS).
Die übertragung von 500 MB mit streaming-Ergebnisse mit meinem service Absturz mit System.OutOfMemoryException.
Ist es überhaupt möglich, zu übertragen, eine solche Menge von Daten?
Hier ist mein WCF-Konfiguration:
<system.serviceModel>
<services>
<service name="CIService" behaviorConfiguration="CIBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:6547/CIService/CIService.svc" />
</baseAddresses>
</host>
<endpoint binding="netTcpBinding"
bindingConfiguration="netTcpBindingConfig"
behaviorConfiguration="CIBehavior.EndpointBehavior"
contract="CIService.ICreatable" />
<endpoint address="mex"
binding="mexHttpBinding"
name="mexTcpBinding"
contract="IMetadataExchange" />
</service>
</services>
<serviceHostingEnvironment multippleSiteBindingEnabled="True" />
<bindings>
<netTcpBinding>
<binding name="netTcpBindingConfig" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="01:00:00" sendTimeout="00:10:00"
hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxConnections="10"
maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
transferMode="Streamed">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CIBehavior">
<serviceMetadata httpGetEnabled="False" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling maxConcurrentCalls="200" maxConcurrentInstances="2147483647" maxConcurrentSessions="100" />
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
<endpointBehavior>
<behavior name="CIBehavior.EndpointBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</endpointBehavior>
</behaviors>
</system.serviceModel>
Meine client-Konfiguration:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_ICreatable"
closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="01:00:00" sendTimeout="00:10:00"
transactionFlow="false"
transferMode="Streamed"
transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard"
listenBacklog="10"
maxBufferPoolSize="2147483647"
maxBufferSize="2147483647"
maxConnections="10"
maxReceivedMessageSize ="2147483647">
<readerQuotas
maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" anabled="false" />
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint name="NetTcpBinding_ICreatable"
address="net.tcp://localhost:6547/CIService/CIService.svc"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_ICreatable"
behaviorConfiguration="CIBehavior.EndpointBehavior"
contract="ICreatable" />
</client>
<behaviors>
<endpointBehavior>
<behavior name="CIBehavior.EndpointBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</endpointBehavior>
</behaviors>
</system.serviceModel>
InformationsquelleAutor der Frage user2003667 | 2013-01-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht maxBufferSize oder maxBufferPoolSize gesetzt, so hoch diese sind, was möglicherweise zu einer out-of-memory-Ausnahme. Die Standardeinstellungen sollten in Ordnung sein.
Check-out Große Daten-und Streaming - auf der MSDN-Website, insbesondere den Abschnitt Spezielle Sicherheitsaspekte für Große Daten - diesem Stück der text ist wichtig
Ich habe ein sehr einfaches Beispiel von streaming-Daten von einem selbst gehosteten Dienst auf einer Konsole-client. Halten Sie den kurzen post habe ich nur Hinzugefügt, der server-code und Teil des client.
Der service-Vertrag
Die service-Implementierung
Den service main
Den service-app.config
Starten Sie den Dienst, müssen möglicherweise ausführen unter admin-Konto öffnen Sie den socket. Erstellen Sie eine client-Konsole-Anwendung, und fügen Sie eine service-Referenz unter der url http://localhost:8080 /StreamService, die mit Service, wie der namespace für die generierten client.
Client main
Dem generierten client-config-Datei muss etwas geändert werden, erhöhen receiveTimeout und setzen maxReceivedMessageSize="4294967295"
Starten Sie den Dienst dann den client. Es strömt eine große Datei ohne Problem.
InformationsquelleAutor der Antwort DerekGn