Dynamically Invoking Web Services... With WCF This Time

Awhile back, I posted on Dynamically Invoking Web Services using ASMX.  To do this, we used a little nasty bit of CodeDOM trickery and reflection, something that just isn't needed with WCF.  Take a look at how much easier this is using WCF.

 BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
IChannelFactory<IRequestChannel> factory = binding.BuildChannelFactory<IRequestChannel>(new BindingParameterCollection());
factory.Open();

EndpointAddress address = 
    new EndpointAddress("https://localhost:43288/WCFService1/Service.svc");
IRequestChannel irc = factory.CreateChannel(address);
using (irc as IDisposable)
{
    irc.Open();
    
    XmlReader reader = XmlReader.Create(new StringReader(
@"<GetDataUsingDataContract xmlns='https://tempuri.org/'>
<composite xmlns:a='https://schemas.datacontract.org/2004/07/' 
xmlns:i='https://www.w3.org/2001/XMLSchema-instance'>
<a:BoolValue>true</a:BoolValue>
<a:StringValue>successfultest</a:StringValue>
</composite>
</GetDataUsingDataContract>"));
    Message m = Message.CreateMessage(MessageVersion.Soap11,
        "https://tempuri.org/IService/GetDataUsingDataContract", reader);
    
    Message ret = irc.Request(m);
    reader.Close();
    
    Console.WriteLine(ret);    
}

//close the factory
factory.Close();

To test this, I simply used Visual Studio 2008 to create a new WCF Service.  I changed the binding from wsHttpBinding to basicHttpBinding, and the rest stays the same.

One of the neat things about the original post was that you could download the definition and compile it.  You could still do the same operations here and use that to serialize into an object used in the CreateMessage method.