2016-07-07 113 views
0

我有修改WCF消息下面的遺留代碼:修改WCF消息體

private void ModifyReceivedRequest(ref Message message) 
{ 
     MemoryStream ms = new MemoryStream(); 
     Encoding encoding = Encoding.UTF8; 
     XmlWriterSettings writerSettings = new XmlWriterSettings { Encoding = encoding }; 
     writerSettings.ConformanceLevel = ConformanceLevel.Fragment; 
     writerSettings.Indent = true; 
     XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter(XmlWriter.Create(ms, writerSettings)); 
     message.WriteBodyContents(writer); 
     writer.Flush(); 
     var array = ms.ToArray(); // 56896306 size 
     string messageBodyString = encoding.GetString(array); 
     // change the message body 
     messageBodyString = messageBodyString.Replace("</applicationStructureData>", "</applicationStructureData><srcDataArray>"); 
     messageBodyString = messageBodyString.Replace("</applicationData>", "</srcDataArray></applicationData>"); 
     ms = new MemoryStream(encoding.GetBytes(messageBodyString)); 
     XmlReader bodyReader = XmlReader.Create(ms); 
     Message originalMessage = message; 
     message = Message.CreateMessage(originalMessage.Version, null, bodyReader); 
     message.Headers.CopyHeadersFrom(originalMessage); 
} 

encoding.GetString(array)拋出OutOfMemoryException。有沒有其他方法可以在不使用這些轉換的情況下修改郵件正文?

回答

0

解決它的方法是擺脫轉換爲字符串。

private void ModifyReceivedRequest(ref Message message) 
    { 
     MemoryStream ms = new MemoryStream(); 
     Encoding encoding = Encoding.UTF8; 
     XmlWriterSettings writerSettings = new XmlWriterSettings { Encoding = encoding }; 
     writerSettings.ConformanceLevel = ConformanceLevel.Fragment; 
     writerSettings.Indent = true; 
     XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter(XmlWriter.Create(ms, writerSettings)); 
     message.WriteBodyContents(writer); 
     writer.Flush(); 

     ms.Position = 0; 
     XmlDocument xDoc = new XmlDocument(); 
     xDoc.Load(ms); 
     ms.Flush(); 
     ms = new MemoryStream(); 

     // XML stuff 

     GC.Collect(); 
     xDoc.Save(ms); 
     ms.Position = 0; 
     XmlReader bodyReader = XmlReader.Create(ms); 
     Message originalMessage = message; 
     message = Message.CreateMessage(originalMessage.Version, null, bodyReader); 
     message.Headers.CopyHeadersFrom(originalMessage); 
    }