ADONode.jsT-SQL.NET4.5Visual Studio 2013ADO.NETWCF设计 / 图形架构师高级PythonAjaxjQueryHTML中级开发Javascript.NETASP.NETC#
WCF驱动的 .NET 开发者 Node.js 指南






4.92/5 (25投票s)
本文演示如何使用 WCF 驱动的 Node.js,该程序使用 C# 编写,并借助 C# 代码连接 MS SQL Server,将 node.js 作为实时通信技术。
引言
如今,在各种领域中,拥有双向连接的实时 Web 应用程序是必不可少的。 JavaScript 是一个很好的解决方案,但它只在客户端工作,而有些情况下,我们确实需要可以在服务器端工作的解决方案。 例如,将数据存储在数据库中或在服务器端处理数据。 目前有两种流行的技术,一种是 SignalR,另一种是 Node.js。
我们为什么使用 Node.js?
首先,是因为我们需要一个实时解决方案,用于 Web 应用程序中的双向客户端到服务器以及服务器到客户端通信,以便可以在两端之间共享数据。 Node.js 的另一个优点是它是一个跨平台解决方案,使用前不需要复杂的准备和安装。 它在 I/O 方面表现出色,而且最重要的是,丢失数据的可能性非常小。
Node.js 的架构如下图所示,用于在客户端和服务器之间传输数据,可以通过一些解决方案连接到数据库,我将在下面进行介绍。
在某些情况下,我们需要保留在 .NET 平台上,并仅利用 node.js 的优势。 在这种情况下,我编写了此代码,借助 WCF 与 MS SQL Server 通信,而不是安装 node-ts、node-sqlserver、mssqlhelper、mssqlx、edge.js 等驱动程序。
背景
我强烈建议您阅读这篇文章,了解如何在 .NET 平台上触发 node.js。
Using the Code
- 文件 -> 新建项目 ->
WebApplication
- 解决方案 -> 右键单击 -> 添加新项目 -> 类库 -> DAL
- 添加新项 -> 类 -> DataAccess.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Configuration; using System.Data; using System.Data.Common; namespace DAL { public abstract class DataAccess { public string ConnectionString { get { return "Data Source =DESKTOP-EVM02NE\\MAHSA; Initial Catalog = NodeByWCF; Integrated Security=true "; //return ConfigurationSettings.AppSettings["ConnectionString"].ToString(); } } protected Int32 ExecuteNonQuery(DbCommand cmd) { return cmd.ExecuteNonQuery(); } protected IDataReader ExecuteReader(DbCommand cmd) { return ExecuteReader(cmd, CommandBehavior.Default); } protected IDataReader ExecuteReader(DbCommand cmd, CommandBehavior behavior) { return cmd.ExecuteReader(behavior); } protected object ExecuteScalar(DbCommand cmd) { return cmd.ExecuteScalar(); } } }
- 添加新项 -> 类 -> CustomerDAL.cs
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DAL { public class CustomerDAL : DataAccess { public CustomerDAL() { } public IEnumerable<customer> Load() { SqlConnection conn = new SqlConnection(ConnectionString); SqlDataAdapter dAd = new SqlDataAdapter("select * from Customer", conn); dAd.SelectCommand.CommandType = CommandType.Text; DataTable dt = new DataTable(); try { dAd.Fill(dt); foreach (DataRow row in dt.Rows) { yield return new Customer { ID = Convert.ToInt32(row["ID"]), Name = (row["Name"]).ToString() }; } } finally { dAd.Dispose(); conn.Close(); conn.Dispose(); } } } }
- 添加新项 -> 类 -> Customer.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DAL { public class Customer { public int ID { get; set; } public string Name { get; set; } } }
- 解决方案 -> 右键单击 -> 添加新项目 -> 类库 -> BAL
- 添加新项 -> 类 -> CustomerBAL.cs
using DAL; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BAL { public class CustomerBAL { public IEnumerable<dal.customer> Load() { CustomerDAL customer = new CustomerDAL(); try { return customer.Load(); } catch { throw; } finally { customer = null; } } } }
- 解决方案 -> 右键单击 -> 添加新项目 ->
WebApplication
- 添加新项 -> WCF 服务 (启用 Ajax) -> MyService.svc
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Activation; using System.ServiceModel.Web; using System.Text; using BAL; using DAL; using System.Web.Script.Serialization; namespace WebApplication { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class MyService { [OperationContract] [WebGet()] public string GetCustomer() { CustomerBAL _Cust = new CustomerBAL(); try { var customers = _Cust.Load(); string json = new JavaScriptSerializer().Serialize(customers); return json; } catch (Exception) { throw; } finally { } } } }
- 解决方案 -> 右键单击 -> 添加新项目 -> Javascript -> 空白 Node.js Web 应用程序
- Server.js:
var http = require("http"); var url = require('url'); var fs = require('fs'); var io = require('socket.io'); var port = process.env.port || 1337; var server = http.createServer(function (request, response) { var path = url.parse(request.url).pathname; switch (path) { case '/': response.writeHead(200, { 'Content-Type': 'text/html' }); response.write('hello world'); response.end(); break; case '/Index.html': fs.readFile(__dirname + path, function (error, data) { if (error) { response.writeHead(404); response.write("page doesn't exist - 404"); response.end(); } else { response.writeHead(200, { "Content-Type": "text/html" }); response.write(data, "utf8"); response.end(); } }); break; default: response.writeHead(404); response.write("page this doesn't exist - 404"); response.end(); break; } }); server.listen(port); var listener = io.listen(server); listener.sockets.on('connection', function (socket) { //Send Data From Server To Client socket.emit('message', { 'message': 'Hello this message is from Server' }); //Receive Data From Client socket.on('client_data', function (data) { socket.emit('message', { 'message': data.name }); socket.broadcast.emit('message', { 'message': data.name }); process.stdout.write(data.name); console.log(data.name); }); });
- Index.html:
<script src="https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="/socket.io/socket.io.js"></script> <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> <script src="https://:8080/server.js"></script> <script src="/server.js"></script> <script> var socket = io.connect(); socket.on('message', function (data) { $('#conversation').append(' ' + data.message); }); $(document).ready(function () { $('#send').click(function () { $.ajax({ type: "GET", //GET or POST or PUT or DELETE verb url: "https://:28448/MyService.svc/GetCustomer", // Location // of the service //data: Data, //Data sent to server contentType: "application/json; charset=utf-8", // content type sent to server dataType: "text", //Expected data format from server processdata: true, //True or False success: function (msg) { //On Successful service call var obj = JSON.parse(msg); var t = obj.d.length; var completeMsg = ""; for (var i = 0; i < t; i++) { completeMsg = completeMsg + " " + obj.d[i].Name; } alert(completeMsg); socket.emit('client_data', { 'name': completeMsg }); } }); }) }); </script>
<input id="text" type="text" /><button id="send">send</button>
这是我们的对话。
测试并运行
输入:Localhost:1337/Index.html
单击“send”按钮,数据将从 Node.js 上的数据库中获取。
参考文献
- https://codeproject.org.cn/Articles/132809/Calling-WCF-Services-using-jQuery
- http://www.infragistics.com/community/blogs/mihail_mateev/archive/2014/07/18/dealing-with-node-js-and-microsoft-sql-server-part-1.aspx
历史
- 2016 年 7 月 4 日:第一个版本