2016-08-04 8 views
3

Ich versuche, einige große Daten in Datenbank über einen WCF-Dienstaufruf zu speichern. Ich kann den Dienst nicht aufrufen. Es wirft einen Fehler:Fehler beim Zuweisen eines verwalteten Speicherpuffers von 268435456 Byte. Die Menge des verfügbaren Arbeitsspeichers ist möglicherweise niedrig

Fehler beim Zuweisen eines verwalteten Speicherpuffers von 268435456 Byte. Die Menge des verfügbaren Speichers kann gering sein

public async Task<int> UploadExportPackage(DTO.Upload.UploadPackage package) 
     { 
      int result = await serviceProxy.UploadResultsAsync(package); 
      return result; 
     } 

Server-Seite config:

<!-- 
     Place limits on the amount of data that can be received in one go. 
     This helps to protect the server from attack and abuse. 
    --> 
    <binding name="primaryBinding" 
      maxReceivedMessageSize="6000000" 
      maxBufferSize="6000000" 
      maxBufferPoolSize="12000000"> 

     <readerQuotas maxArrayLength="6000000" 
        maxStringContentLength="6000000" /> 

     <!-- 
      Set the security mode. Apply at: 
      - Transport layer 
      - Message layer 
     --> 
     <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </basicHttpsBinding> 
</bindings> 

Stapelüberwachung:

Exception no: 0 

Nächste Ausnahme: Nachricht:

Fehler beim Zuweisen eines verwalteten Speicherpuffers von 268435456 Byte. Die Menge an verfügbarem Speicher kann niedrig sein.

Stapelüberwachung: Server-Stack-Trace: bei System.Runtime.Fx.AllocateByteArray (Int32 Größe) bei System.Runtime.InternalBufferManager.PooledBufferManager.TakeBuffer (Int32 buffer) bei System.ServiceModel.Channels.BufferManagerOutputStream. init (Int32 Urspr, Int32 maxSizeQuota, Int32 effectiveMaxSize, Bufferbuffer) bei System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage (Message Nachricht, Bufferbuffer, Int32 initialOffset, Int32 maxSizeQuota) bei System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder. WriteMessage (Nachrichtennachricht, Int32 maxMessageSize, BufferManager-PufferManager, Int32 messageOffset).210 bei System.ServiceModel.Channels.HttpOutput.SerializeBufferedMessage (Message Nachricht, Boolean shouldRecycleBuffer) bei System.ServiceModel.Channels.HttpOutput.SendAsyncResult.SendWithoutChannelBindingToken() bei System.ServiceModel.Channels.HttpOutput.SendAsyncResult.Send() bei System.ServiceModel.Channels.HttpOutput.SendAsyncResult..ctor (httpOutput httpOutput, httpResponseMessage httpResponseMessage, Boolean suppressEntityBody, Timespan-Timeout, AsyncCallback Rückruf, Objektzustand) bei System.ServiceModel.Channels.HttpOutput.BeginSendCore (httpResponseMessage httpResponseMessage, Timespan-Timeout, AsyncCallback Rückruf, Objektstatus) bei System.ServiceModel.Channels.HttpChannelFactory 1.HttpRequestChannel.HttpChannelAsyncRequest.SendWebRequest() at System.ServiceModel.Channels.HttpChannelFactory 1.HttpRequestChannel.HttpChannelAsyncRequest.BeginSendRequest (Nachricht Nachricht, TimeSpan Timeout) bei System.ServiceModel.Channels.RequestChannel.BeginRequest (Message Nachricht, Timespan-Timeout, AsyncCallback Rückruf, Objektzustand) bei System.ServiceModel.Channels.SecurityChannelFactory 1.RequestChannelSendAsyncResult.BeginSendCore(IRequestChannel channel, Message message, TimeSpan timeout, AsyncCallback callback, Object state) at System.ServiceModel.Security.ApplySecurityAndSendAsyncResult 1.OnSecureOutgoingMessageComplete (Message-Nachricht) an System.ServiceModel.Security.ApplySecurityAndSendAsyncResult 1.Begin(Message message, SecurityProtocolCorrelationState correlationState) at System.ServiceModel.Channels.SecurityChannelFactory 1.SecurityRequestChannel.BeginRequest (Message Nachricht, Timespan-Timeout, AsyncCallback Rückruf, Objektzustand) bei System.ServiceModel.Dispatcher.RequestChannelBinder.BeginRequest (Message Nachricht, Timespan-Timeout, AsyncCallback Rückruf, Objektzustand) bei System.ServiceModel.Channels .ServiceChannel.SendAsyncResult.StartSend (Boolean completedSynchronously) bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.FinishEnsureOpen (IAsyncResult-Ergebnis, Boo Lean completedSynchronous) bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.StartEnsureOpen (Boolean completedSynchronously) bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.FinishEnsureInteractiveInit (IAsyncResult Ergebnis, Boolean completedSynchronously) bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.StartEnsureInteractiveInit() bei System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.Begin() bei System.ServiceModel.Channels.ServiceChannel. BeginCall (String-Aktion, boolesche Methode, ProxyOperationRuntime-Operation, Object [] ins, TimeSpan-Zeitlimit, AsyncCallback-Callback, Object asyncState) bei System.ServiceModel.Channels.ServiceChannel.BeginCall (Kanal ServiceChannel, Operation ProxyOperationRuntime, Object [] ins, AsyncCallback-Callback , Objekt asyncState) bei System.Threading.Tasks.TaskFactory 1.FromAsyncImpl[TArg1,TArg2,TArg3](Func 6 beginMethod, Func 2 endFunction, Action 1 endAction, TArg1 arg1, TArg2 arg2, TArg3 arg3, Objektzustand, TaskCreationOptions creationOptions) bei System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.CreateGenericTask [T] (ServiceChannel Kanal, ProxyOperationRuntime Betrieb Object [] Inputparameter) bei System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.CreateGenericTask (ServiceChannel Kanal, ProxyOperationRuntime Betrieb Object [ ] Inputparameter) bei System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.CreateTask (ServiceChannel Kanal, IMethodCallMessage method, ProxyOperationRuntime Betrieb) bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeTaskService (IMethodCallMessage method, ProxyOperationRuntime Betrieb) bei System.ServiceModel. Channels.ServiceChannelProxy.Invoke (IMessage Nachricht)

Ausnahme r ethrown auf [0]: bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (Message & MsgData, Typ Int32) bei RossendaleClient8 .DAL.RR.IRossendaleService.UploadResultsAsync (UploadPackage Paket) bei RossendaleClient8.DAL.RR.RossendaleServiceClient.UploadResultsAsync (UploadPackage Paket) bei RossendaleClient8.DAL.RossendaleServiceClient.d__13.MoveNext()

Nächste Ausnahme: Nachricht:

Ausnahme vom Typ 'System.OutOfMemoryException' wa s geworfen.

Stapelüberwachung: bei System.Runtime.Fx.AllocateByteArray (Int32 Größe)

+0

Möglicherweise müssen Sie Ihre Daten in kleinere Blöcke partitionieren und mehrere Sends an den Dienst senden. – Kevin

+0

@Kevin gibt es keine Möglichkeit, die ganze Menge zu senden? Es ist nur etwa 200 MB – user1800674

+0

Vielleicht Speicher zum Server hinzufügen. Glauben Sie nicht, dass dies das Problem wirklich beheben wird. Schiebt einfach so lange aus, bis es passiert. – Kevin

Antwort

0

Wie bereits erwähnt, bevor ich die Transfermode auf „gestreamte“ geändert habe, aber ich habe erhöht auch die maximale Puffergröße. Das Zeitlimit und maxAllowedContent wurde auf 300 MB erhöht, damit größere Dateien hochgeladen werden können. Funktioniert jetzt großartig.

1

Ich habe noch nie als 50MB mehr zu senden versucht, WCF, aber ich bin mir ziemlich sicher, dass eine 256MB + Datei kann leicht zu Problemen führen, wie ich würde oben erwähnt, schlage vor, Sie versuchen Sie folgendes:

  • Streifen Dateien in kleinere kleinere Stücke, zB 50 MB pro Datei
  • die Speicherzuweisung Ihres Dienstes prüfen beim Versuch, die Datei zu senden, wird er es den maximal verfügbaren Speicherplatz auf der Maschine überschreiten?
4

Wenn Ihre Bindung es zulässt, versuchen Sie es mit TransferMode.Streamed. Sie können sich auch BinaryMessageEncoding ansehen. Von MSDN:

  • Buffered transfers hold the entire message in a memory buffer until the transfer is complete.
  • Streamed transfers only buffer the message headers and expose the message body as a stream, from which smaller portions can be read at a time.

Der Standardtransfermode ist Buffered, so wird die gesamte Nachricht an den Speicher geladen.Wenn Sie den Streaming-Transfermodus aktivieren, können Sie die Größe der Speichernutzung verwalten, indem Sie den Wert von MaxBufferSize bearbeiten.

Mit BinaryMessageEncoding können Sie Daten komprimieren, die Sie über das Netzwerk senden. Hier ist ein Beispiel App.Config Inhalt

<customBinding> 
    <binding name="primaryBinding" openTimeout="00:01:00" closeTimeout="00:01:00" 
       sendTimeout="00:30:00" receiveTimeout="00:30:00"> 
     <binaryMessageEncoding compressionFormat="GZip"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
         maxNameTableCharCount="2147483647" /> 
     </binaryMessageEncoding> 
     <httpsTransport transferMode="Streamed" maxReceivedMessageSize="6000000" 
         maxBufferSize="6000000" maxBufferPoolSize="12000000" />   
    </binding>  
    </customBinding> 

Gleiche Konfiguration im Code

private Binding GetBinding() 
    { 
     var config = new BindingElementCollection();    
     config.Add(new BinaryMessageEncodingBindingElement() 
     { 
      CompressionFormat = CompressionFormat.GZip, 
     }); 
     config.Add(new HttpsTransportBindingElement() 
     { 
      MaxBufferPoolSize = 12000000, 
      MaxBufferSize = 6000000, 
      MaxReceivedMessageSize = 6000000, 
      TransferMode = TransferMode.Streamed, 
     }); 

     var resultBinding = new CustomBinding(config) 
     { 
      OpenTimeout = TimeSpan.FromMinutes(1), 
      CloseTimeout = TimeSpan.FromMinutes(1), 
      ReceiveTimeout = TimeSpan.FromMinutes(1), 
      SendTimeout = TimeSpan.FromMinutes(1), 
     }; 

     return resultBinding; 
    } 
0

Ich bin bewusst, dass es vielleicht keine geeignete Lösung für alle, aber ...

Wir hatten kürzlich ein ähnliches Problem. Nur einer unserer Entwickler hatte Probleme beim lokalen Debuggen von Code. Stellt sich heraus, dass er nicht die 64-bit Version von IIS Express verwendet.