node.js - 如何使用 node.js 插件将命名空间添加到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>

上面有代码,我收到一个答案 false,我应该发送的是这个( 使用 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调用的所有参数都在命名空间中,在我使用 node.js 时没有定义。

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

时间:

我找到了一种方法使它工作,即将所有数据作为字符串发送并自行编写 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) {
. . .
 }

...