Ello
Ello

Reputation: 917

Consuming DynamicsNAV WebService with Node.JS node-soap

I want to consume the WebService from Microsoft Dynamics NAV 2009 with a small node.js application. The Service itself works fine, I am using it with a c# application, now I want to get data into my nodejs/expressjs application but, I always get Invalid WSDL URL as an error message.

Here is the WSDL as my Browser sees it.

enter image description here

Now I tried to connect with node-soap, following the documentation, by normal and by basic auth, but everytime I get an Invalid WSDL URL error.

Here are the methods I tried for a test connection:

    var url = "http://navsrv:7047/DynamicsNAV2/WS/Produktiv/Page/WDCETA";
    var auth = "Basic " + new Buffer("*********" + ":" + ****************").toString("base64");

    soap.createClient(url, function(err, client) {
      console.log('Without basic out:');

      if (err)
      {
        console.log('[ERROR] -> ');
        console.log(err);
      }

      console.log(client);
    });


    soap.createClient(url, {wsdl_headers: {Authorization: auth} }, function(err, client) {
      console.log('With basic out:');
      if (err)
      {
        console.log('[ERROR] -> ');
        console.log(err);
      }
      console.log(client);
    });

And this is the response I get:

Without basic out:
[ERROR] ->
[Error: Invalid WSDL URL: http://navsrv:7047/DynamicsNAV2/WS/Produktiv/Page/WDDCETA

 Code: 401

 Response Body: ]
undefined

With basic out:
[ERROR] ->
[Error: Invalid WSDL URL: http://navsrv:7047/DynamicsNAV2/WS/Produktiv/Page/WDDCETA

 Code: 401

 Response Body: ]
undefined

Upvotes: 1

Views: 2417

Answers (1)

Ello
Ello

Reputation: 917

As it turned out, the build in HTTP-Server from DyanmicsNAV requires SPNEGO or NTLM as authentication. After some tries creating a proper SPNEGO request with nodejs/node-soap I turned off SPNEGO and enabled NTLM.

With the help of soap-ntlm and httpntlm I could retrieve the wsdl.

This is some testing code how I could manage to retrieve the WSDL file. For now I am happy, but I guess when it comes to invoke function there will be some other issues :)

var soap = require('soap-ntlm');
var fs = require('fs');
var httpntlm = require('httpntlm');

var url = 'http://navsrv:7047/DynamicsNAV2/WS/Produktiv/Page/WDCETA';
var username = '*******';
var password = '***********';



httpntlm.get({
  url: url,
  password: password,
  username: username
}, function(err, wsdl) {
  if (err)
  {
      console.log('ERR: -> ');
      console.log(err);
      return;
  }
  fs.writeFile('wsdl_cache/WDCETA.wsdl', wsdl.body, function() {

    soap.createClient(__dirname + '/wsdl_cache/WDCETA.wsdl', function(err, client) {
      if (err) {
        console.log('SOAP ERR: ->');
        console.log(err);
        return;
      }

      client.setSecurity(new soap.NtlmSecurity(username, password));

      console.log(client);
    });

  })

});

Upvotes: 1

Related Questions