Wcf Système.InsufficientMemoryException. N'a pas pu allouer une gestion de la mémoire tampon de 536 870 912 octets
J'ai un service WCF méthode qui retourne un gros byte[] tableau autour de 2 mo en taille. Cependant quand je lance la méthode de la WcfTestClient, j'obtiens l'exception suivante.
System.InsufficientMemoryException
Failed to allocate a managed memory buffer of 536870912 bytes. The amount of available memory may be low.
J'ai cherché sur google, et les gens semblent avoir ce problème mais j'ai du mal à trouver une quelconque solution et la cause réelle de pourquoi est-elle en essayant de créer un énorme tampon en premier lieu?
Ci-dessous sont mes paramètres de configuration. J'ai mis le maxItemsInObjectGraph="2147483647", sinon, lancer une exception à ce sujet. Le reste est simple, je suppose.
Serveur
<system.serviceModel>
<services>
<service behaviorConfiguration="Wcf.ServiceBehavior"
name="Wcf.WcfService">
<endpoint address="" binding="wsHttpBinding" contract="Wcf.IWcfService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Wcf.ServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</serviceBehaviors>
</behaviors>
<diagnostics>
<messageLogging maxMessagesToLog="30000"
logEntireMessage="true"
logMessagesAtServiceLevel="true"
logMalformedMessages="true"
logMessagesAtTransportLevel="true">
</messageLogging>
</diagnostics>
</system.serviceModel>
WcfTestClient Config C'est le fichier de configuration par défaut qui est chargé avec des WcfTestClient
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IWcfService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:4151/Service1.svc" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IWcfService" contract="IWcfService"
name="WSHttpBinding_IWcfService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
Ici est la Trace de Pile d'exception
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>131075</EventID>
<Type>3</Type>
<SubType Name="Error">0</SubType>
<Level>2</Level>
<TimeCreated SystemTime="2010-06-29T09:18:23.9616589Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{7870ff09-e268-4e9d-a692-389fd03db1aa}" />
<Execution ProcessName="WebDev.WebServer20" ProcessID="4812"
ThreadID="17" />
<Channel />
<Computer>PC-008915</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord"
Severity="Error">
<TraceIdentifier>
http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Diagnostics.ThrowingException.aspx</TraceIdentifier>
<Description>Throwing an exception.</Description>
<AppDomain>5ab4f443-1-129222741421051645</AppDomain>
<Exception>
<ExceptionType>System.InsufficientMemoryException,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>Failed to allocate a managed memory buffer of
536870912 bytes. The amount of available memory may be
low.</Message>
<StackTrace>at
System.ServiceModel.Diagnostics.Utility.AllocateByteArray(Int32
size) at
System.ServiceModel.Channels.BufferManager.GCBufferManager.TakeBuffer(Int32
bufferSize) at
System.ServiceModel.Channels.BufferedOutputStream.AllocNextChunk(Int32
minimumChunkSize) at
System.ServiceModel.Channels.BufferedOutputStream.WriteCore(Byte[]
buffer, Int32 offset, Int32 size) at
System.ServiceModel.Channels.BufferedOutputStream.Write(Byte[]
buffer, Int32 offset, Int32 size) at
System.Xml.XmlStreamNodeWriter.FlushBuffer() at
System.Xml.XmlStreamNodeWriter.GetBuffer(Int32 count,
Int32& offset) at
System.Xml.XmlStreamNodeWriter.UnsafeWriteUTF8Chars(Char*
chars, Int32 charCount) at
System.Xml.XmlStreamNodeWriter.WriteUTF8Chars(String
value) at
System.Xml.XmlUTF8NodeWriter.WriteEndElement(String
prefix, String localName) at
System.Xml.XmlSigningNodeWriter.WriteEndElement(String
prefix, String localName) at
System.Xml.XmlBaseWriter.WriteEndElement() at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteString(XmlWriterDelegator
xmlWriter, String value, XmlDictionaryString name,
XmlDictionaryString ns) at
WritePropertyDtoToXml(XmlWriterDelegator , Object ,
XmlObjectSerializerWriteContext , ClassDataContract )
at
System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator
xmlWriter, Object obj, XmlObjectSerializerWriteContext
context) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator
xmlWriter, Object obj, Boolean isDeclaredType, Boolean
writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle
declaredTypeHandle) at
WriteArrayOfPropertyDtoToXml(XmlWriterDelegator ,
Object , XmlObjectSerializerWriteContext ,
CollectionDataContract ) at
System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator
xmlWriter, Object obj, XmlObjectSerializerWriteContext
context) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator
xmlWriter, Object obj, Boolean isDeclaredType, Boolean
writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle
declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference(XmlWriterDelegator
xmlWriter, Object obj, Boolean isDeclaredType, Boolean
writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle
declaredTypeHandle) at
WriteEntityTypeDtoToXml(XmlWriterDelegator , Object ,
XmlObjectSerializerWriteContext , ClassDataContract )
at
System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator
xmlWriter, Object obj, XmlObjectSerializerWriteContext
context) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator
xmlWriter, Object obj, Boolean isDeclaredType, Boolean
writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle
declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference(XmlWriterDelegator
xmlWriter, Object obj, Boolean isDeclaredType, Boolean
writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle
declaredTypeHandle) at
WriteNodeTypeDtoToXml(XmlWriterDelegator , Object ,
XmlObjectSerializerWriteContext , ClassDataContract )
at
System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator
xmlWriter, Object obj, XmlObjectSerializerWriteContext
context) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator
xmlWriter, Object obj, Boolean isDeclaredType, Boolean
writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle
declaredTypeHandle) at
WriteArrayOfNodeTypeDtoToXml(XmlWriterDelegator ,
Object , XmlObjectSerializerWriteContext ,
CollectionDataContract ) at
System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator
xmlWriter, Object obj, XmlObjectSerializerWriteContext
context) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract
dataContract, XmlWriterDelegator xmlWriter, Object obj,
RuntimeTypeHandle declaredTypeHandle) at
System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator
writer, Object graph) at
System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator
writer, Object graph) at
System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator
writer, Object graph) at
System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter
writer, Object graph) at
System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart(XmlDictionaryWriter
writer, PartInfo part, Object graph) at
System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameter(XmlDictionaryWriter
writer, PartInfo part, Object graph) at
System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeBody(XmlDictionaryWriter
writer, MessageVersion version, String action,
MessageDescription messageDescription, Object
returnValue, Object[] parameters, Boolean isRequest) at
System.ServiceModel.Dispatcher.OperationFormatter.SerializeBodyContents(XmlDictionaryWriter
writer, MessageVersion version, Object[] parameters,
Object returnValue, Boolean isRequest) at
System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents(XmlDictionaryWriter
writer) at
System.ServiceModel.Channels.BodyWriter.WriteBodyContents(XmlDictionaryWriter
writer) at
System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents(XmlDictionaryWriter
writer) at
System.ServiceModel.Channels.Message.WriteBodyContents(XmlDictionaryWriter
writer) at
System.ServiceModel.Security.SecurityAppliedMessage.WriteBodyToSignThenEncryptWithFragments(Stream
stream, Boolean includeComments, String[]
inclusivePrefixes, EncryptedData encryptedData,
SymmetricAlgorithm algorithm, XmlDictionaryWriter
writer) at
System.ServiceModel.Security.WSSecurityOneDotZeroSendSecurityHeader.ApplyBodySecurity(XmlDictionaryWriter
writer, IPrefixGenerator prefixGenerator) at
System.ServiceModel.Security.SecurityAppliedMessage.OnWriteMessage(XmlDictionaryWriter
writer) at
System.ServiceModel.Channels.Message.WriteMessage(XmlDictionaryWriter
writer) at
System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage(Message
message, BufferManager bufferManager, Int32
initialOffset, Int32 maxSizeQuota) at
System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.WriteMessage(Message
message, Int32 maxMessageSize, BufferManager
bufferManager, Int32 messageOffset) at
System.ServiceModel.Channels.HttpOutput.SerializeBufferedMessage(Message
message) at
System.ServiceModel.Channels.HttpOutput.Send(TimeSpan
timeout) at
System.ServiceModel.Channels.HttpRequestContext.OnReply(Message
message, TimeSpan timeout) at
System.ServiceModel.Activation.HostedHttpContext.OnReply(Message
message, TimeSpan timeout) at
System.ServiceModel.Channels.RequestContextBase.Reply(Message
message, TimeSpan timeout) at
System.ServiceModel.Security.SecuritySessionServerSettings.SecuritySessionRequestContext.OnReply(Message
message, TimeSpan timeout) at
System.ServiceModel.Channels.RequestContextBase.Reply(Message
message, TimeSpan timeout) at
System.ServiceModel.Channels.RequestContextBase.Reply(Message
message) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.Reply(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessageCleanup(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&
rpc) at
System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean
isOperationContextSet) at
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.Dispatch(MessageRpc&
rpc, Boolean isOperationContextSet) at
System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext
request, Boolean cleanThread, OperationContext
currentOperationContext) at
System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext
request, OperationContext currentOperationContext) at
System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult
result) at
System.ServiceModel.Dispatcher.ChannelHandler.OnContinueAsyncReceive(Object
state) at
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2()
at
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.OnSecurityContextCallback(Object
o) at
System.Security.SecurityContext.Run(SecurityContext
securityContext, ContextCallback callback, Object
state) at
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke()
at
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks()
at
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.CompletionCallback(Object
state) at
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ScheduledOverlapped.IOCallback(UInt32
errorCode, UInt32 numBytes, NativeOverlapped*
nativeOverlapped) at
System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32
error, UInt32 bytesRead, NativeOverlapped*
nativeOverlapped) at
System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32
errorCode, UInt32 numBytes, NativeOverlapped*
pOVERLAP)</StackTrace>
<ExceptionString>System.InsufficientMemoryException:
Failed to allocate a managed memory buffer of 536870912
bytes. The amount of available memory may be low.
---> System.OutOfMemoryException: Exception of type
'System.OutOfMemoryException' was thrown. at
System.ServiceModel.Diagnostics.Utility.AllocateByteArray(Int32
size) --- End of inner exception stack trace
---</ExceptionString>
<InnerException>
<ExceptionType>System.OutOfMemoryException, mscorlib,
Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>Exception of type
'System.OutOfMemoryException' was thrown.</Message>
<StackTrace>at
System.ServiceModel.Diagnostics.Utility.AllocateByteArray(Int32
size)</StackTrace>
<ExceptionString>System.OutOfMemoryException:
Exception of type 'System.OutOfMemoryException' was
thrown. at
System.ServiceModel.Diagnostics.Utility.AllocateByteArray(Int32
size)</ExceptionString>
</InnerException>
</Exception>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
Attente
Nabeel
double possible de n'a pas pu allouer une gestion de la mémoire tampon de 134217728 bytes. La quantité de mémoire disponible peut être basse
OriginalL'auteur nabeelfarid | 2010-06-29
Vous devez vous connecter pour publier un commentaire.
Êtes-vous sûr de votre tableau d'octets n'est que d'environ 2 MO? De l'exception message que vous avez posté, il semble que le message dans la mémoire tampon est de près de 0,5 GO (536 870 912 octets). C'est cette erreur qui se passe toujours bien? Vous exécutez plusieurs appels de service au moment où cela se produit?
Aussi comprendre que lors de l'utilisation de WSHttpBinding avec le Message de Sécurité que l'ensemble du message est tamponné. Ma compréhension est que cela se fait pour chiffrer le message entier dans un seul bloc de sorte que les détails correspondants peuvent être fournies dans l'en-tête. En d'autres termes l'en-tête besoins de la longueur du message qui est inconnu jusqu'à ce que le chiffrement est fait.
Voir ma Question connexe de savoir où je demande À la meilleure façon de transférer de grandes charges utiles de données à l'aide de wsHttp avec WCF avec le message de sécurité.
Ainsi, par défaut, WCF utilise le DataContractSerializer lequel vous pouvez tester vous-même par l'instanciation d'une et d'arranger le même tableau d'octets et l'enregistrement de la sortie du disque. De cette façon, vous pouvez voir le contenu sérialisé et voir vérifie sa taille. Une autre option serait d'utiliser la WCF suivi des utilitaires de prendre un regard sur les messages.
Vous pouvez également regarder la MaxBytesPerRead de la propriété ainsi que les autres contraintes. Il y a une belle liste de ces au bas de la poste dans le lien suivant. nirajrules.wordpress.com/2009/08/03/...
Grâce Pierson. Je vais jeter un oeil.
OriginalL'auteur
Notre Pool d'Applications a été mis à Recycler tous les 0 minutes (pas de recyclage). Après avoir changé de nouveau à 1740, manuellement et de recyclage de la piscine, l'erreur a disparu. Je pense que le Pool d'Applications s'exécute disponible /commis de mémoire et renvoie ce message si tous vos objets n'ont pas été éliminés correctement .NET
OriginalL'auteur
Nous avons également eu exactement le même problème. Essayé de télécharger un document de seulement 15 mo et l'utilisation de la mémoire ciel explosé à environ 1 go. Cela a entraîné un dépassement de mémoire d'exception sur le serveur.
La solution pour nous a été très simple. Le contrat de données mis en œuvre une ICollection de l'objet ByteArray. Lorsque nous avons changé cela dans un Byte[] le problème a disparu et l'utilisation de la mémoire a été de nouveau normal.
Apparemment, le processus de sérialisation ne pouvez pas gérer les ICollection de type a d'une manière efficace.
OriginalL'auteur