1

我正在尝试使用node-soap 模块来使用 SOAP Web 服务。但是,在调用 Web 服务的方法之一时出现“无法解析响应”错误。

这是实现:

var soap = require('soap');
var url = 'http://myservice.com/MyService.svc?wsdl';
var args = {
    Username: '***',
    Password: '***'
};

soap.createClient(url, function(err, client) {
    if (!err) {      
        client.MyService(args, function(err, response) {
            if (!err) {
                console.log('MyService response:', response);
            } else {
                console.log('Error in MyService:', err);
            }
        });
    } else {
        console.log('Error in createClient: ', err);
    }
});

我怎样才能解决这个问题?

4

3 回答 3

3

我解决了这个问题。虽然 Web 服务需要application/soap+xml内容类型,但内容类型是text/xml。所以我在createClient()参数中添加了forceSoap12Headers: true来强制 node-soap 使用 SOAP 1.2 版本。此外,由于 EndpointDispatcher错误中的 AddressFilter 不匹配,无法在接收器处处理带有 To ' ' 的消息,因此我将ws-addressing标头添加到soap标头中。

整体代码:

var soap = require('soap');
var url = 'http://myservice.com/MyService.svc?wsdl';
var args = {
    Username: '***',
    Password: '***'
};
var soapOptions = {
    forceSoap12Headers: true
};
var soapHeaders = {
    'wsa:Action': 'http://tempuri.org/MyPortName/MyAction',
    'wsa:To': 'http://myservice.com/MyService.svc'
};

soap.createClient(url, soapOptions, function(err, client) {
    if (!err) {
        client.addSoapHeader(soapHeaders, '', 'wsa', 'http://www.w3.org/2005/08/addressing');
        client.MyService(args, function(err, response) {
            if (!err) {
                console.log('MyService response:', response);
            } else {
                console.log('Error in MyService:', err);
            }
        });
    } else {
        console.log('Error in createClient: ', err);
    }
});
于 2017-03-16T12:20:47.247 回答
0

添加此代码 client.setSecurity(new soap.BasicAuthSecurity('username', 'password')); 在您创建客户之后。它对我有用:

var soap = require('soap');
var url = 'http://myservice.com/MyService.svc?wsdl';
soap.createClient(url, function(err, client) {
if (!err) {      
      client.setSecurity(new soap.BasicAuthSecurity('username', 'password'));
      client.MyService(args, function(err, response) {
      if (!err) {
            console.log('MyService response:', response);
        } else {
            console.log('Error in MyService:', err);
        }
    });
} else {
    console.log('Error in createClient: ', err);
}
});
于 2017-06-21T20:13:45.930 回答
0

我已经更新了 npm soap 版本,它对我有用

于 2018-06-01T13:51:13.733 回答