获得WCF消息的正文

我应该在一个简单的问题上遇到一些麻烦。

我有一个服务方法,它采用ac#Message类型,我想只提取该soap消息的正文,并使用它来构造一个全新的消息。 我不能在Message类上使用GetBody()方法,因为我不知道序列化主体的类型。

有没有人知道如何从消息中提取身体? 或者构造一个具有相同主体的新消息,即没有原始消息头等?

不是为了取代Yann的答案,而是为了它的价值,这是一个将消息体复制到具有不同动作头的新消息的完整示例。 您也可以添加或自定义其他标头作为示例的一部分。 我花了太多时间把它写下来扔掉它。 =)

 class Program { [DataContract] public class Person { [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } public override string ToString() { return string.Format("{0}, {1}", LastName, FirstName); } } static void Main(string[] args) { var person = new Person { FirstName = "Joe", LastName = "Schmo" }; var message = System.ServiceModel.Channels.Message.CreateMessage(MessageVersion.Default, "action", person); var reader = message.GetReaderAtBodyContents(); var newMessage = System.ServiceModel.Channels.Message.CreateMessage(MessageVersion.Default, "newAction", reader); Console.WriteLine(message); Console.WriteLine(); Console.WriteLine(newMessage); Console.WriteLine(); Console.WriteLine(newMessage.GetBody()); Console.ReadLine(); } } 

您可以使用Message上的GetReaderAtBodyContents方法访问消息正文:

 using (XmlDictionaryReader reader = message.GetReaderAtBodyContents()) { string content = reader.ReadOuterXml(); //Other stuff here... } 

访问邮件正文时,邮件状态将更改,并且将不再允许使用邮件内容。 为避免这种情况,重要的是缓冲消息并使用缓冲区本身的CreateMessage方法设置原始消息。

码:

 Public Function AfterReceiveRequest(ByRef message As System.ServiceModel.Channels.Message, ByVal channel As IClientChannel, ByVal instanceContext As InstanceContext) As Object Implements IDispatchMessageInspector.AfterReceiveRequest Try Dim msgBuffer As MessageBuffer = message.CreateBufferedCopy(Int32.MaxValue) message = msgBuffer.CreateMessage() Dim copy As Message = msgBuffer.CreateMessage() Dim writer As XmlWriter = XmlWriter.Create(Console.OpenStandardOutput(), Me.xws) copy.WriteMessage(writer) writer.Flush() Console.WriteLine() msgBuffer.Close() Dim buffer As MessageBuffer = message.CreateBufferedCopy(Int32.MaxValue) message = buffer.CreateMessage() Dim copym As Message = buffer.CreateMessage() Dim bodyReader As XmlDictionaryReader = copym.GetReaderAtBodyContents() Dim newMessage = System.ServiceModel.Channels.Message.CreateMessage(MessageVersion.[Default], "newAction", bodyReader) Dim content As String = bodyReader.ReadOuterXml() Console.WriteLine(message.Properties.Via) Console.WriteLine(content) Catch ex As Exception Throw GetFaultException("ReportGenerator Request - error: ", "", ex) End Try End Sub