By sending of messages directly on the message layer, you will often have to create and manipulate the message itself. 
Unfortunately WCF does not offer a very powerful support for message manipulation.
For example following code shows how to send the message: 
| ChannelFactory<IRequestChannel> nativeRequestFactory = new ChannelFactory<IRequestChannel>(httpBinding, endpointAddress);
 
 IRequestChannel reqChannel = nativeRequestFactory.CreateChannel();
 
 Message reply = reqChannel.Request(msg);
 | 
However, there is one thing missing in this example. That is, how to create the message. There are various ways 
how to do this, but personally, I miss the way to build the message from string and XmlDocument. Fortunately, there is a relative simple way
to do that. The method Message.CreateMessage, which creates the message has, following signature: 
Message msg = Message.CreateMessage(MessageVersion, string , BodyWriter); 
All it has to be done is to derive the class BodyWriter. Following example shows how to implement custom body writer which 
creates the message from string and XmlDocument. 
| using System; using System.Collections.Generic;
 using System.Text;
 using System.ServiceModel.Channels;
 using System.Xml;
 namespace Client {
 public class MyBodyWriter : BodyWriter {
 XmlDocument m_XDoc;
 
 public MyBodyWriter(XmlDocument xDoc) : base(false)
 {
 m_XDoc = xDoc;
 }
    public MyBodyWriter(string message) : base(false) {
 m_XDoc = new XmlDocument();
 m_XDoc.LoadXml(message);
 }
    protected override void OnWriteBodyContents(System.Xml.XmlDictionaryWriter writer)
 {
 writer.WriteRaw(m_XDoc.OuterXml);
 }
 }
 }
 | 
Now, by using of the custom writer following code can be used to create and send the message: 
| ChannelFactory<IRequestChannel> nativeRequestFactory = new ChannelFactory<IRequestChannel>(httpBinding, endpointAddress);
 
 IRequestChannel reqChannel = nativeRequestFactory.CreateChannel();
 
 string st = @"<QueryMessage xmlns=""cevapproduction"">
 <CevapQuery xmlns:a="http://schemas.datacontract.org/2004/07/Server"
 xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><a:Cijena>7</a:Cijena>
 <a:KajmakYesNo>true</a:KajmakYesNo></CevapQuery></QueryMessage>";
 
 MyBodyWriter bodyWriter1 = new MyBodyWriter(st);
 
 Message msg = Message.CreateMessage(MessageVersion.Soap11,
 "cevapproduction/ICevap/ImaLiCevapa", bodyWriter);
 
 Message reply = reqChannel.Request(msg1);
 | 
		    
            
	        Posted
		    
Apr 08 2007, 11:42 PM
			by
		    
Damir Dobric