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.
Comments
Anonymous
January 20, 2009
PingBack from http://blog.a-foton.ru/index.php/2009/01/21/dynamically-invoking-web-services-with-wcf-this-time/Anonymous
January 20, 2009
Is there an advantage to dynamically constructing the service operation over binding with service references directly?Anonymous
January 21, 2009
In my opinion, not for the majority of cases. However, there have been several customers who came up with cases where they wanted their own "Add Service Reference" type of functionality at runtime. I have gotten quite a few emails on the previous post, thought it was time to write up the WCF version as well. When I work with a lot of folks on services, I find that the Managed Services Engine (http://www.codeplex.com/servicesengine) actually fits their problems more cleanly, providing virtual services instead of pushing the brunt of the work into the client.Anonymous
January 21, 2009
Thank you for submitting this cool story - Trackback from DotNetShoutoutAnonymous
January 25, 2009
Development Merlin Wizard Framework - A framework for easily making wizards in .NET. LINQ to SQL templatesAnonymous
September 09, 2016
Finally found the article about Dynamically Invoking Web Services , thank you sir.