Consume SOAP Service with COM Component





5.00/5 (4 votes)
This article explains how to consume a WebService (SOAP) from plain VisualBasicScript by using a COM DLL written in C#.
Sure there is a way to send a request to SOAP service "manually" by writing down a XML file and posting it to server as HTTP POST like this.
This is however a hard way, you need to handle such a complex structures like:
<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:soap=""http://www.w3.org/2003/05/soap-envelope""
xmlns:fruit=""http://fabrikam.net""><soap:Header/><soap:Body>
<fruit:findBananasbyId><Id>" & bananaId & /Id></fruit:findBananasById></soap:Body></soap:Envelope>"
and believe me, that is just a beginning. :)
On the other side, it is very simple to create a client application to consume a SOAP service in Visual Studio. Take a look for example at this link.
Now you can create a .NET library (DLL) but how to use it from a VBS?
The answer is - the DLL need to be a COM object!
Assumed we have such a COM-DLL, we can easily use it:
Dim oComSoap
Set oComSoap = CreateObject("myComInterface")
oComSoap.SendRequest
There are certainly two points / pitfalls:
- The .NET WCF Application has an app.config looking like this:
< system.serviceModel > < bindings > < wsHttpBinding > < binding name = "WSHttpBinding_PurchaseInvoiceService" /> </ wsHttpBinding > </ bindings > < client > < endpoint address = "http://ax5-w8r2-01.contoso.com/MicrosoftDynamicsAXAif50/purchaseinvoiceservice.svc" binding = "wsHttpBinding" bindingConfiguration = "WSHttpBinding_PurchaseInvoiceService" contract = "PurchaseInvoiceService.PurchaseInvoiceService" name = "WSHttpBinding_PurchaseInvoiceService" > < identity > < userPrincipalName value = "Administrator@contoso.com" /> </ identity > </ endpoint > </ client > </ system.serviceModel >
Your stand-alone DLL makes no use of app.config and shall replace it by creating an according class:
PurchaseInvoiceServiceClient _oClient; WSHttpBinding oBinding = new WSHttpBinding(); oBinding.Name = "WSHttpBinding_PurchaseInvoiceService"; string strEndPoint = "http://ax5-w8r2-01.contoso.com/MicrosoftDynamicsAXAif50/purchaseinvoiceservice.svc"; EndpointAddress oEndPoint = new EndpointAddress(strEndPoint); _oClient = new PurchaseInvoiceServiceClient(oBinding, oEndPoint);
- The .NET WCF Application marks an entry point / the main function as
[STAThread]
that means, the COM threading model for an application is single-threaded apartment (STA).This is what you need to do for every SOAP interface of your DLL:
[STAThread] public bool SendRequest()