摘要:有时我们需要在WCF中做一些复杂数据处理和逻辑判断等,这时候就需要在NodeJS中调用WCF服务获取数据,这篇文件介绍如何在Node中调用WCF服务获取数据。

Node项目中调用WCF服务获取数据,通常需要将获取到的table或list类型数据转为json格式,来调用回调函数向前台显示数据。以下代码显示如何调用wcf服务及如何将数据转为json类型。
wcf服务发布后的地址如:http://localhost:3721/service/IsAuth

需要添加的引用如下:

var xpath = require('xpath.js');
var dom = require('xmldom').DOMParser;

声明代理及拼接要发送的数据:

var BasicHttpBinding = require('wcf.js').BasicHttpBinding,
Proxy = require('wcf.js').Proxy,
binding = new BasicHttpBinding(),
proxy = new Proxy(binding, 'http://localhost:3721/service'),
message = "<Envelope xmlns='http://schemas.xmlsoap.org/soap/envelope/'>" +
"<Header />" +
"<Body>" +
"<LoginVer xmlns='http://tempuri.org/'>" +
"<name>admin</name><pwd>123456</pwd>"+//成对的参数
"</LoginVer>" +
"</Body>" +
"</Envelope>";

发送数据,并根据不同的返回类型转换数据为json:

proxy.send(message, "http://tempuri.org/service/IsAuth", function (response, ctx) {
if (ctx && ctx.error) {
callback(ctx.error, '');
return;
} if(response.indexOf('s:Envelope')>0) {
if (response.indexOf('xs:schema') > 0) {
//返回数据为Table
var start = response.indexOf('<DocumentElement');
var end = response.indexOf('</DocumentElement>');
if(start == -1){
callback(null,{table:[]});
}else{
var datas = response.slice(start, end + 18);
converttabletojson(datas, function (err, data) {
callback(err, data);
});
}
}
else{
//返回数据为List
var start = response.indexOf('<' + method + 'Result');
var end = response.indexOf('</' + method + 'Response');
if(end == -1){
callback(null,{list:[]});
}else{
var datas = response.slice(start, end);
convertlisttojson(datas, method + 'Result', function (err, data) {
callback(err, data);
});
}
}
}
else{
callback(new Error('404,Not Found Page'));
} });

返回数据为Table时,将Table转为json方法:

function converttabletojson(table, callback) {
try {
var doc = new dom().parseFromString(table), jsonr = [];
var nodes = xpath(doc, '/DocumentElement/*');
nodes.forEach(function (item) {
var row = {};
var childs = item.childNodes;
for (var key in childs) {
if (childs[key].localName) {
var name = childs[key].localName;
var value = childs[key].firstChild != null ? childs[key].firstChild.data : ' ';
row[name] = value;
}
};
jsonr.push(row);
});
doc = null;
nodes = null;
callback(null, {table: jsonr});
} catch (err) {
doc = null;
nodes = null;
callback(err);
}
};

返回数据为List时,将List转为json方法:

function convertlisttojson(lists,root, callback) {
try {
var doc = new dom().parseFromString(lists), jsonr = {};
var childdoc = doc.childNodes[0].childNodes;
for(var i =0;i<childdoc.length;i++){
var rows = [];
if(!childdoc[i].firstChild){
if(typeof childdoc[i].data === 'string'){
jsonr['mydata'] = jsonr['mydata'] || [];
jsonr['mydata'].push(childdoc[i].data);
}
continue;
}else if(typeof childdoc[i].firstChild.data === 'string'){
jsonr['mydata'] = jsonr['mydata'] || [];
jsonr['mydata'].push(childdoc[i].firstChild.data );
continue;
}
var lsttagname = childdoc[i].firstChild.tagName,
lstname = lsttagname.substr(lsttagname.indexOf(':')+1);
if(lstname){
var lsts = childdoc[i].getElementsByTagName(lsttagname);
for(var j =0;j<lsts.length;j++){
var item = lsts[j];
var childs = item.childNodes, row={};
for(var key in childs){
if(childs[key].localName) {
var name = childs[key].localName;
var value = childs[key].firstChild.data;
row[name] = value;
}
};
rows.push(row);
}
jsonr[lstname] = rows;
}
}
doc = null;nodes =null;
callback(null,{list:[jsonr]});
}catch(err){
doc = null;nodes =null;
callback(err);
}
};

以上两个方法是根据wcf返回不同的数据类型做相应的判断。以下是返回两种类型的数据的示例:

List:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<IsAuthResponse xmlns="http://tempuri.org/">
<IsAuthResult>yes</IsAuthResult>
</IsAuthResponse>
</s:Body>
</s:Envelope>

Table:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetDataResponse xmlns="http://tempuri.org/">
<GetDataResult xmlns:a="http://schemas.datacontract.org/2004/07/Model" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:scoreValue>
<a:ScoreValue><a:name>语文</a:name> <a:value>90</a:value> </a:ScoreValue>
<a:ScoreValue><a:name>数学</a:name><a:value>92</a:value></a:ScoreValue>
<a:ScoreValue><a:name>英语</a:name><a:value>83</a:value></a:ScoreValue>
</a:scoreValue>
</GetDataResult>
</GetDataResponse>
</s:Body>
</s:Envelope>

在 Node.js 上调用 WCF Web 服务的更多相关文章

  1. WCF:为 SharePoint 2010 Business Connectivity Services 构建 WCF Web 服务(第 1 部分,共 4 部分)

    转:http://msdn.microsoft.com/zh-cn/library/gg318615.aspx 摘要:通过此系列文章(共四部分)了解如何在 Microsoft SharePoint F ...

  2. JAVA与.NET的相互调用——通过Web服务实现相互调用

    JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候 ...

  3. node.js之十大Web框架

    之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了.再到后来是因为Settings-Sync插件二次开发,我需要用node. ...

  4. 风尘浪子 只要肯努力,梦想总有一天会实现 WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流) _转

    如果你曾经负责开发企业ERP系统或者OA系统,工作流对你来说一定并不陌生.工作流(Workflow)是对工作流程及其各操作步骤之间业务规则 的抽象.概括.描述.工作流要解决的主要问题是:为实现某个业务 ...

  5. Koa--基于Node.js平台的下一代web开发框架的安装

    koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的 Web 框架. 使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函 ...

  6. Node.js 从零开发 web server博客项目[express重构博客项目]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  7. node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...

  8. Node.js结合Selenium做Web自动化测试

    发现腾讯课堂上有个node.js结合Selenium做Web自动化测试的教学视频, 听来感觉不错,一来老师讲的还不错,二来node.js这门语言会越来越热,学会总没什么坏处,三来发现CukeTest这 ...

  9. node创建一个简单的web服务

    本文将如何用node创建一个简单的web服务,过程也很简单呢~ 开始之前要先安装node.js 1.创建一个最简单的服务 // server.js const http = require('http ...

随机推荐

  1. 用命令行导出和导入MySQL数据库

    php 用命令行导出和导入MySQL数据库   命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files ...

  2. typecho流程原理和插件机制浅析(第二弹)

    typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件 ...

  3. Locking

    Computer Science An Overview _J. Glenn Brookshear _11th Edition To solve such problems, a DBMS could ...

  4. Python文件方法

    打开文件 使用open函数,语法格式为:open( name[, mode[, buffering]]),name为打开文件名,mode为打开文件方式,buffering控制文件的缓冲. mode可选 ...

  5. 【转】C# 解析JSON格式数据

    http://blog.csdn.net/coolszy/article/details/8606803 JSON简介 JSON(全称为JavaScript ObjectNotation) 是一种轻量 ...

  6. 【转】C# 解析 json

    C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...

  7. In App Purchase

    参考文章1,参考文章2,参考文章3, 参考文章3 一.Product 分类:      Consumables: 应该在应用里被消费掉的.(Coupon, 生命数)      Non-Consumab ...

  8. Android项目框架升级尝鲜OkHttp

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 随着项目日趋稳定,需求不再总是变化,那么是时间来整理下项目了.先简单介绍下,本项目最初使用loop4 ...

  9. 15 款最好的 C/C++ 编译器和集成开发环境

    我们有很多编程语言来进行 web 开发,比如 Java,.Net,PHP,Ruby,Perl,Python 等等.今天我们主要讨论的是两大古老而又流行的语言: C 和 C++ ,它们有着许多卓越的特性 ...

  10. Bundle文件的创建和使用(一)

    经常会出现某个需求:将自己的模块或者开放类,封装成静态库给其他人提供方便的调用. 但是当你的模块中需要大量使用xib,图片,音频或者其他资源文件时,无法添加至静态库.这个时候就需要将一些资源文件封装至 ...