如何在node.js中使用wcf?

时间:2015-05-09 12:25:28

标签: node.js web-services wcf soap wsdl

我想在node.js中使用wcf。我试过了:

soap.createClient(url, function (err, client) { if (err) { console.log(err); return false; } client.myFunc(args, function(err1, result) { if(result.success) return true; }); });

但是createClient(错误块)发生错误。它说:WSDL或包含的意外的根元素。 然后我尝试了wcf.js:

var BasicHttpBinding = require('wcf.js').BasicHttpBinding
, Proxy = require('wcf.js').Proxy
, binding = new BasicHttpBinding()
, proxy = new Proxy(binding, " http://localhost/myService.svc");
var message = '<Envelope xmlns=' +
            '"http://schemas.xmlsoap.org/soap/envelope/">' +
            '<Header />' +
            '<Body>' +
            '<myFunc xmlns="http://localhost/myService.svc/">' +
            '<value>'+ args +'</value>' +
            '</AddNewUser>' +
            '</Body>' +
            '</Envelope>';
proxy.send(message, "http://localhost/myService.svc", function (result, ctx){
    if(result.success)
        return true;
    });

但我的程序没有调用发送功能。 最后,我尝试将WCF配置为WSDL发布,如下所示:WCF cannot configure WSDL publishing

但它没有用到!我怎样才能解决我的问题?

1 个答案:

答案 0 :(得分:1)

我遇到了这个,在我的情况下,因为响应是gzip压缩的。 npm包肥皂确实指定了'Accept-Encoding': 'none',但是SOAP服务器(由我的公司开发)表现不佳,并发回一个gzipped主体。肥皂包不能解决这个问题。

我要看的另一个选择是在httpclient options createClient参数中传递我自己的request并将其解压缩。在GitHub上的node-soap代码的测试中有一个使用自定义httpclient的示例:https://github.com/vpulim/node-soap/blob/master/test/client-customHttp-test.js

我还没有弄清楚如何解压缩响应,但是一旦我解决了这个问题,我就会更新这个答案。

<强>更新

对于gzipped响应,它更简单。您可以在createClient options对象的wsdl_options属性中将所需的任何选项传递给节点gzip: true。这包括request,这将使soap.createClient('http://someservice.com/?wsdl', { wsdl_options: { gzip: true } }, function (err, client) {}); 处理gzip压缩请求。 e.g。

client.someSoapCall({arg1:"12345"},
  function (err, result) {},
  { gzip: true });

然后在进行SOAP方法调用时,在回调后将gzip参数添加到options参数中,例如

using (StreamWriter outfile = new StreamWriter("C:\\Output\\Final\\BigInteger.txt"))
    {      
         foreach var part in numberParts
         {
             outfile.Write(part);
         }
    }

我通过挖掘节点soap代码来解决这个问题。文档没有明确提到这些事情。