如何使用带有node.js的soap插件向soap方法调用添加命名空间

时间:2014-01-28 10:40:11

标签: node.js wcf soap

我想从node.js

向WCF soap web服务发送职位

我正在使用soap node.js插件并调用这样的远程方法:

       var localisationMessage = {
            BlackboxNumber: adc,
            Heading: heading,
            Kilomettrage: kilomettrage,
            Latitude: latitude,
            Longitude: longitude,
            PositionDate: '2014-01-28T10:28:09.859225+01:00', //date.toISOString(),
            Satelite: satelite,
            Speed: speed,
        }

        var args = {
            mess: localisationMessage
        }

        console.dir(args);

        self.soap_client.SendLocalisation(args, function(err, result) {
             ...
        }

使用tcpdump,这是发送给服务的内容:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"  
               xmlns:tns="http://tempuri.org/" 
               xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
               xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract">
<soap:Header></soap:Header>
<soap:Body>
<tns:SendLocalisation xmlns:tns="http://tempuri.org/" xmlns="http://tempuri.org/">
<tns:mess>
<tns:BlackboxNumber>521020</tns:BlackboxNumber>
<tns:Heading>0</tns:Heading>
<tns:Kilomettrage>0</tns:Kilomettrage>
<tns:Latitude>50.82401</tns:Latitude>
<tns:Longitude>4.30416</tns:Longitude>
<tns:PositionDate>2014-01-28T10:28:09.859225+01:00</tns:PositionDate>
<tns:Satelite>7</tns:Satelite>
<tns:Speed>0</tns:Speed>
</tns:mess>
</tns:SendLocalisation>
</soap:Body>
</soap:Envelope>

使用上面的代码,我收到一个错误的答案 我应该发送的是这个(使用C#的tcpdump跟踪):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body><SendLocalisation xmlns="http://tempuri.org/">
<mess xmlns:a="http://my_webservice_namespace" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:BlackboxNumber>358696048896800</a:BlackboxNumber>
<a:Heading>0</a:Heading>
<a:Kilomettrage>0</a:Kilomettrage>
<a:Latitude>50</a:Latitude>
<a:Longitude>3</a:Longitude>
<a:PositionDate>2014-01-28T10:28:09.859224+01:00</a:PositionDate>
<a:Satelite>7</a:Satelite>
<a:Speed>0</a:Speed>
</mess>
</SendLocalisation>
</s:Body>
</s:Envelope>

正如您所看到的,主要区别在于soap调用的所有参数都在命名空间a中,当我使用node.js中的服务时,该命名空间未定义

如何在node.js上的soap方法调用期间定义此命名空间?

1 个答案:

答案 0 :(得分:-2)

我找到了一种让它工作的方法,即将所有数据作为字符串发送并自己编写xml。

如果您有更好的解决方案,请发送另一个答案。

        var args = '<tns:SendLocalisation>' +
                   '<tns:mess xmlns:a="http://my_webservice_namespace" ' +
                   'xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' +
                   '<a:BlackboxNumber>' + adc + '</a:BlackboxNumber>' +
                   '<a:Heading>' + heading + '</a:Heading>' +
                   '<a:Kilomettrage>' + kilomettrage + '</a:Kilomettrage>' +
                   '<a:Latitude>' + latitude + '</a:Latitude>' +
                   '<a:Longitude>' + longitude + '</a:Longitude>' +
                   '<a:PositionDate>' + date.toISOString() + '</a:PositionDate>' +
                   '<a:Satelite>' + satelite + '</a:Satelite>' +
                   '<a:Speed>' + speed + '</a:Speed>' +
                   '</tns:mess>' +
                   '</tns:SendLocalisation>';

        self.soap_client.SendLocalisation(args, function(err, result) {
           ...
        }