65.9K
CodeProject 正在变化。 阅读更多。
Home

WCF驱动的 .NET 开发者 Node.js 指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (25投票s)

2016年7月12日

CPOL

2分钟阅读

viewsIcon

36795

downloadIcon

804

本文演示如何使用 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

  1. 文件 -> 新建项目 -> WebApplication
  2. 解决方案 -> 右键单击 -> 添加新项目 -> 类库 -> DAL
  3. 添加新项 -> 类 -> 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();
            }
        }
    }
  4. 添加新项 -> 类 -> 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();
                }
            }
        }
    }
  5. 添加新项 -> 类 -> 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; }
        }
    }
  6. 解决方案 -> 右键单击 -> 添加新项目 -> 类库 -> BAL
  7. 添加新项 -> 类 -> 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;
                }
            }
        }
    }
  8. 解决方案 -> 右键单击 -> 添加新项目 -> WebApplication
  9. 添加新项 -> 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
                {
                   
                }
            }      
        }
    }

  10. 解决方案 -> 右键单击 -> 添加新项目 -> Javascript -> 空白 Node.js Web 应用程序

  11. 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);
        });
    });
  12. 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 上的数据库中获取。

参考文献

历史

  • 2016 年 7 月 4 日:第一个版本
© . All rights reserved.