node-soap generates xmlns prefix (tns), but it doesn't apply it to SOAP's method:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://v5.soap.platform.helloworld.com/"> <soap:Body> <authenticate> <apiKey>meh</apiKey> <username>ryan</username> <password>dahl</password> </authenticate> </soap:Body> </soap:Envelope>
This is the right XML, as tested in Google Chrome's Boomerang extension, there is tns prefix in SOAP's method (authenticate):
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://v5.soap.platform.helloworld.com/"> <soap:Body> <tns:authenticate> <apiKey>meh</apiKey> <username>ryan</username> <password>dahl</password> </tns:authenticate> </soap:Body> </soap:Envelope>
To fix the node-soap's broken default, add this option on createClient method:
var options = { ignoredNamespaces: { namespaces: [], override: true } } soap.createClient ( url, options, function ( err, client ) {
Using that, node-soap will apply the tns prefix to the SOAP's method name.
.NET's generated SOAP works out of the box, notice that there is no prefix in SOAP call:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"> <s:Header> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" /> </s:Header> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <authenticate xmlns="http://v5.soap.platform.helloworld.com/"> <apiKey xmlns="">meh</apiKey> <username xmlns="">ryan</username> <password xmlns="">dahl</password> </authenticate> </s:Body> </s:Envelope>
Happy Coding!