Condividi tramite


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 DotNetShoutout

  • Anonymous
    January 25, 2009
    Development Merlin Wizard Framework - A framework for easily making wizards in .NET. LINQ to SQL templates

  • Anonymous
    September 09, 2016
    Finally found the article about Dynamically Invoking Web Services , thank you sir.