ASP.NET
SignalLAND是ASP.NET开采职员的叁个新库,它令你的应用程序增加实时Web功效变得很简单。什么是“实时网络”作用?能够实时地将劳动器端代码推送到连年的顾客端的力量。

    表明:开拓的案例为Hub(集线器)

SignalR简介

SignalR是什么?

ASP.NET Signal奥迪Q5 是为 ASP.NET
开拓职员提供的四个库,能够简化开辟职员将实时 Web
效用丰盛到应用程序的经过。实时 Web
功用是指那样大器晚成种功能:当所连接的顾客端变得可用时服务器代码能够马上向其推送内容,实际不是让服务器等待顾客端央求新的数额。

ASP.NET
Signal酷威是ASP.NET开垦职员的一个新库,能够使开垦实时Web成效变得简单。Signal君越允许服务器和客户端之间的双向通讯。服务器今后得以将内容即时推送到三回九转的顾客端。SignalTiggo饱含用于连接管理(举个例子连接和断开事件),连接分组和授权的API。经常情况下,Signal冠道会使用JavaScript(Ajax长日子轮询)的长轮询(long
polling卡塔尔(قطر‎的法子来促成客商端和服务器通讯,随着Html5中WebSockets现身,SignalTiguan也援救WebSockets通讯和援助COLANDS(跨源财富分享)。此外Signal中华V开垦的顺序不止限定于宿主在IIS中,也得以宿主在任何应用程序,包蕴调控台,客户端程序和Windows服务等,别的还扶持Mono,这意味它能够兑现跨平台安插在Linux境遇下。JSONP未有配备,并且总是否跨域的,假若顾客端和服务器都扶助,则接受WebSocket。

SignalRubicon内部有两类对象:
Http悠久连接(Persisten Connection卡塔尔(英语:State of Qatar)对象:

  • Connection表示用于发送单收件人,分组或播报音信的轻松终端。漫长连接API(由PersistentConnection类的.NET代码表示)为开荒职员提供了对SignalHeritage EV公开的起码通讯合同的第一手访问。用来减轻长日子总是的效率。还能由客商端主动向服务器要求数据,而服务器端不供给完毕太多细节,只须要管理PersistentConnection
    内所提供的三个事件:OnConnected, OnReconnected, OnReceived, OnError
    和 OnDisconnect 就能够。

  • Hub(集线器)对象:基于连接API创设的越来越高端别的管道,允许你的顾客端和服务器直接调用相互的法子。Signal途达像魔术同样处理跨机器边界的调整,允许客商端像当地点法同样方便地调用服务器上的主意,反之亦然。对于使用远程调用API(如.NET
    Remoting)的开辟人士来讲,使用Hubs通讯模型将会很熟练。使用集线器还允许你将强类型参数字传送递给艺术,从而启用模型绑定。

Signal索罗德将全部音讯的置换封装起来,客商端和服务器都以利用JSON来维系的,在服务端注解的富有Hub新闻,都会生成JavaScript输出到顾客端,.NET则依赖Proxy来扭转代理对象,而Proxy的内部则是将JSON调换来对象。

您也许曾经听大人讲过WebSockets,生龙活虎种新的HTML5
API,能够达成浏览器和服务器之间的双向通讯。SignalRubicon将要可用的书面下使用WebSockets,假设不是,您的应用程序代码保持不改变,则足以健康地回减低到别的才具和才具。

豆蔻梢头、开荒遇到 

参考

官方网址及学习文书档案:https://www.asp.net/signalr
github:https://github.com/SignalR
Signal揽胜参考项目:https://github.com/SignalR/Samples

SignalENCORE还提供了二个特轻松的尖端API,用于在ASP.NET应用程序中实施服务器到顾客端RPC(在客商端的浏览器中从服务器端.NET代码调用JavaScript函数),甚至为接连几日来管理加多有用的钩子,比方连接/断开事件,分组连接,授权。

  VS2013  ,window10

实战

工具要求:

  • Visual Studio 2013 及以上
  • .NET 4.5及以上
  • MVC 5及以上
  • SignalR版本2及以上
  1. 采用Visual Studio 二零一二,成立二个MVC项目

  2. 通过Nuget安装SignalR包。
    install-package Microsoft.AspNet.SignalR

  3. 设置SignalPRADO成功后,SignalPRADO库的本子将被增添进Scripts文件夹下。具体如下图所示:

image.png
  1. 在施工方案财富微电脑中,右键单击该项目(也得以新建三个类库),选取增多新建文件夹,并累计叁个名字为Hubs的新文件夹。
    用鼠标右键单击该Hubs文件夹,新建叁个SignalGL450 Hub
    Class(v2)类,并创造三个名称叫Chat
    .cs。您将接收此类作为将音信发送到全体客商端的SignalPAJERO服务器中央。
image.png

  1. 用上面包车型大巴代码替换Chat 类中的代码。

    public class Chat : Hub
    {
        public void Send(string message)
        {
            Clients.All.send(message);
        }
    }
  1. 创制二个Startup类,假如开端制造MVC项指标时候未有改善身份验证的话,那个类会私下认可增加的,即使原来就有就没有必要再行增添了。依据如下代码更新Startup类。

using Owin;
using Microsoft.Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}
  1. 编纂HomeController在Controllers /
    HomeController.cs中找到的类,并将以下措施增加到类中。此情势重返您将在稍后的手续中开创的闲聊视图。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace BasicChat.Mvc.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}
  1. 用以下代码替换Chat.cshtml的剧情。

将SignalPRADO和此外脚本库增多到Visual
Studio项目中时,程序包微机只怕会安装比本大旨中显得的本子更新的SignalR脚本文件版本。确定保障代码中的脚本引用与品种中安装的脚本库的本子相相称。

@{
    ViewBag.Title = "聊天窗口";
}

<h2>Chat</h2>

<div class="container">
    <input type="text" id="message" />
    <input type="button" id="sendmessage" value="Send" />
    <input type="hidden" id="displayname" />
    <ul id="discussion"></ul>
</div>

@section scripts
{
    <!--引用SignalR库. -->
    <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
     <!--引用自动生成的SignalR 集线器(Hub)脚本.在运行的时候在浏览器的Source下可看到 -->
    <script src="~/signalr/hubs"></script>

    <script>
        $(function () {
            // 引用自动生成的集线器代理
            var chat = $.connection.serverHub;
            // 定义服务器端调用的客户端sendMessage来显示新消息

            chat.client.sendMessage = function (name, message) {
                // 向页面添加消息
                $('#discussion').append('<li><strong>' + htmlEncode(name)
                    + '</strong>: ' + htmlEncode(message) + '</li>');
            };

            // 设置焦点到输入框
            $('#message').focus();
            // 开始连接服务器
            $.connection.hub.start().done(function () {
                $('#sendmessage').click(function () {
                    // 调用服务器端集线器的Send方法
                    chat.server.send($('#message').val());
                    // 清空输入框信息并获取焦点
                    $('#message').val('').focus();
                });
            });
        });

        // 为显示的消息进行Html编码
        function htmlEncode(value) {
            var encodedValue = $('<div />').text(value).html();
            return encodedValue;
        }
    </script>
    }

效果

image.png

SignalHaval闲聊应用程序演示了七个大旨的Signal中华V开垦职分:成立二个集线器作为服务器上的关键和睦对象,并动用Signal瑞鹰jQuery库来发送和摄取新闻。

在代码示例中,ChatHub类从Microsoft.AspNet.Signal奥迪Q5.Hub类派生。从Hub类派生是创设Signal奔驰M级应用程序的实用办法。您能够在Hub类上创造公共措施,然后通过从网页中的脚本调用这个主意来拜谒那些主意。

在闲谈代码中,客商端调用ChatHub.Send方法发送一条新新闻。集线器通过调用Clients.All.addNewMessageToPage将音讯发送给全数客商端。
所述发送方法以身作则多少个集线器概念:

  • 在集线器上声称公用方法,以便客商端能够调用它们。
  • 采纳Microsoft.AspNet.Signal福特Explorer.Hub.Clients属性访问连接到此集线器的具有客商端。
  • 调用客商端上的函数(如addNewMessageToPage函数)来更新顾客端。
    SignalR和jQuery

代码示例中的Chat.cshtml视图像和文字件呈现了怎么着利用Signal帕杰罗jQuery库与Signal凯雷德集线器进行通讯。代码中的基本任务是创办对集线器的自动生成代理的援引,评释服务器能够调用的将内容推送到顾客端的效果与利益,以至运维连接以将消息发送到集线器。

以下代码显示了什么在本子中创制回调函数。服务器上的集线器类调用此函数将内容更新推送到每一个客商端。对htmlEncode函数的可选调用彰显了黄金时代种在将消息内容展示在页面在此之前对其进行HTML编码的法子,以免备脚本注入。

chat.client.addNewMessageToPage = function (name, message) {
    // Add the message to the page. 
    $('#discussion').append('<li><strong>' + htmlEncode(name) 
        + '</strong>: ' + htmlEncode(message) + '</li>');
};

以下代码呈现怎么开荒与集线器的连接。代码运营连接,然后传递叁个函数来拍卖“闲聊”页面中“
发送”开关上的点击事件。

这种形式可以保证在事件管理程序施行此前建立连接。

$.connection.hub.start().done(function () {
    $('#sendmessage').click(function () {
        // Call the Send method on the hub. 
        chat.server.send($('#displayname').val(), $('#message').val());
        // Clear text box and reset focus for next comment. 
        $('#message').val('').focus();
    });
});

依据B/S形式来看,运路程序的时候,Web页面就与SignalLacrosse的劳务营造了连年,具体的创造连接的代码正是:$.connection.hub.start(卡塔尔国。那句代码的法力便是与Signal福睿斯服务创建连接,后边的done函数注明建构连接成功后为发送开关注册了三个click事件,当客商端输入内容点击发送按键后,该Click事件将会触发,触发实践的操作为:
chat.server.send($(‘#message’卡塔尔(英语:State of Qatar).val(卡塔尔国卡塔尔(英语:State of Qatar)。那句代码表示调用服务端的send函数,而服务端的Send韩式又是调用全体顾客端的sendMessage函数,而客商端中sendMessage函数正是将新闻增多到对应的新闻列表中。那样就兑现了播音新闻的意义了。

                                                                       
                                                                       
                                       —来自Signal冠道的法定表明

二、步骤

ABP实时劳务 – 集成SignalENVISION

 

  张开vs创建三个新的施工方案,增多叁个空的WebForm项目。

简介

在依照ABP创立的花色中,有一个比较轻易的秘诀选拔
SignalR,那正是使用Abp.Web.SignalR。详细情况请仿照效法SignalR文档。

  依照SignalRubicon的官方网址教程,做一些精简的剖判。

  使用NuGet增多引用。命令:PM>  instal-package
Microsoft.AspNet.SignalLX570 或许工具->NuGet程序包微处理器->管理解决方案的NuGet程序包,里搜索和丰富

安装

使用Nuget安装[Abp.Web.SignalR(http://www.nuget.org/packages/Abp.Web.SignalR卡塔尔(قطر‎到你的花色中(平日是您的Web项目卡塔尔何况在模块中增加被重视的模块:

[DependsOn(typeof(AbpWebSignalRModule))]
public class YourProjectWebModule : AbpModule
{
    //...
}

下一场,在您的OWIN Startup类中利用 MapSignal瑞虎 方法,正如你过去那么做的:

[assembly: OwinStartup(typeof(Startup))]
namespace MyProject.Web
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();

            //...
        }
    }
}

注意:Abp.Web.SignalR 依赖于
Microsoft.AspNet.SignalR.Core。所以,你须要安装
Microsoft.AspNet.SignalR到你的Web项目中。详细情形请仿照效法SignalR文档。

1.想要使用SignalHighlander要引进它的组装,Microsoft.AspNet.Signal揽胜极光。

三、添加Default.aspx页面

客户端

脚本 abp.signalr.js 应该被援用到页面中。它身处
Abp.Web.Resources
包中(它曾经被设置到起步模板中卡塔尔国。 大家应当在signalr hubs 后引述它:

<script src="~/signalr/hubs"></script>
<script src="~/Abp/Framework/scripts/libs/abp.signalr.js"></script>

这么做了现在,Signal福特Explorer就早就格外的安顿和购并到您的类别中了。

在你的web项目中,应用NuGet包工具引进。怎么引进包能够到NuGet的官方网站看教程。

  页面中第意气风发引述jquery 1.6.4 及以上版本库

创设连接

当 abp.signalr.js
被引述到页面后,ABP会自动的连天到你的服务器。日常我们都会这么做,不过在好几意况下你不想这么做。你能够像上面代码所示禁用自动连接:

<script>
    abp.signalr = abp.signalr || {};
    abp.signalr.autoConnect = false;
</script>

在这里种景色下,你能够手动调用 abp.signalr.connect()
函数来连接服务器。

当顾客端连接到服务器时,全局事件 “abp.signalr.connected”
会被触发。当连接创设成功的时候,你能够注册那些事件来利用对应的步履。详细情形请参照他事他说加以考察Javascript函数库

2.新建三个Signal兰德CR-V集线器类,那样就能够获取多个合龙自Hub的类,

  增添援用jquery.signal奥迪Q7-2.2.1.min.js 库

停放效用

你能够在应用程序中运用具备的Signal昂科威的意义。还应该有,在 Abp.Web.SignalR
中贯彻了一些放置功效。

能够由此打标签的办法改进集线器的名字,那在顾客端代码会用到。

  添加script引用 /signalr/js   

1. 通知

Abp.Web.SignalR 实现了 IRealTimeNotifier
接口来发送实时光阴到客商端。因而,你的客户能够得到实时的推送通告。

方式是[HubName(“myHub”)],命名空间是在Microsoft.AspNet.Signal本田CR-V.Hubs下。

  以上为援引为必得,何况逐个不可调治, /signalr/js
正视与jquery.signalTucson-2.2.1.min.js库,何况是动态变化的(即:空头支票该文件)

2. 在线顾客端

ABP提供了 IOnlineClientManager
来得到在线客户的音讯(如:注入IOnlineClientManager以致利用GetByUserIdOrNull,
GetAllClients, IsOnline
方法卡塔尔(قطر‎。为了能够不荒谬办事,IOnlineClientManager须求三个通讯根基设备。Abp.Web.SignalR
提供了这一个幼功设备。假诺设置了SignalTiguan,那么在使用的其它层都足以注入并应用IOnlineClientManager。

3.引进二个配置类,这里用的是Startup,能够透过OWIN Startup类得到。

  Default.aspx页面包车型地铁html代码如下:

3. PascalCase vs. camelCase

Abp.Web.SignalR 使用 CamelCasePropertyNamesContractResolver 重写了
Signal汉兰达’s 暗许的类别化类 ContractResolver。由此,在服务器端类具有
PascalCase 属性,而在客商端为了发送/选取对象,大家运用 camelCase
(因为camelCase在JavaScript中更受招待卡塔尔(قطر‎。假使你想在有个别程序聚集忽视这些,那么你能够将那四个程序集增加AbpSignalRContractResolver.IgnoredAssemblies
列表中。

代码如下:

  

你的SignaR代码

使用 Abp.Web.SignalR 包也会简化你的
Signal福睿斯代码。假如大家想要增多叁个Hub到您的应用程序中:

public class MyChatHub : Hub, ITransientDependency
{
    public IAbpSession AbpSession { get; set; }

    public ILogger Logger { get; set; }

    public MyChatHub()
    {
        AbpSession = NullAbpSession.Instance;
        Logger = NullLogger.Instance;
    }

    public void SendMessage(string message)
    {
        Clients.All.getMessage(string.Format("User {0}: {1}", AbpSession.UserId, message));
    }

    public async override Task OnConnected()
    {
        await base.OnConnected();
        Logger.Debug("A client connected to MyChatHub: " + Context.ConnectionId);
    }

    public async override Task OnDisconnected(bool stopCalled)
    {
        await base.OnDisconnected(stopCalled);
        Logger.Debug("A client disconnected from MyChatHub: " + Context.ConnectionId);
    }
}

为了使大家的Hub能够省略的登记到依附于注入系统中,大家得以兑现
ITransientDependency
接口。当然你能够依照你的急需,注册它为单例形式。大家也使用性质注入了Session和Logger。

SendMessage是hub的贰个方式,它能够被客商端应用。在此个点子中,我们得以调用全数客商端的
getMessage函数。正如你看见的那样,大家得以行使AbpSession来得到当前的顾客id(即便顾客已经报到卡塔尔国。为了演示,大家也重写了
OnConnected 和 OnDisconnected,实际这里是无需的。

上面是用在Hub中,用来发送/选用音信的客商端脚本:

var chatHub = $.connection.myChatHub; //get a reference to the hub

chatHub.client.getMessage = function (message) { //register for incoming messages
    console.log('received message: ' + message);
};

abp.event.on('abp.signalr.connected', function() { //register for connect event
    chatHub.server.sendMessage("Hi everybody, I'm connected to the chat!"); //send a message to the server
});

然后,在大家须求发送新闻到服务器时,我们就足以应用
chatHub。实际情况请参照他事他说加以考察SignalR文档。

using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Drawing board</title>
    <script src="Scripts/jquery-1.6.4.min.js"></script>
    <script src="Scripts/jquery.signalR-2.2.1.min.js"></script>
    <script src="/signalr/js"></script>
    <script src="Scripts/DrawingBoard.js"></script>
    <style>
        div {
            margin: 3px;
        }

        canvas {
            border: 2px solid #808080;
            cursor: default;
        }
    </style>
</head>
<body>
    <div>
        <div>
            <label for="color">Color: </label>
            <select id="color">
            </select>
        </div>
        <canvas id="canvas" width="300" height="300"></canvas>
        <div>
            <button id="clear">Clear canvas</button>
        </div>
    </div>
</body>
</html>

  这一个类现在的作用正是布署。当中app.MapSignalPAJERO(卡塔尔;正是布置全数的集线器。

  页面达成效益描述:达成轻松画板的多少个页面同步成效。

内部IAppBuilder在Owin命名空间,OwinStartup在Microsoft.Owin命名空间。

  代码中 #canvas为画板所用标签  ,#color
为画笔颜料挑选,#clear为解除画板的开关

4.顾客端(这里运用的是网页的客商端,是用js代理的卡塔尔(قطر‎

   Scripts/DrawingBoard.js  代码为Hub顾客端须要的逻辑。代码如下:

引进SIgnalRubicon组件的时候,会转移三个Scripts文件,里面蕴含JQuery和signaGL450的js文件。

  

在做网页前能够先测量检验signalLacrosse是不是安排成功,通过
项目地址/signalr/hubs如能开采,

$(function () {

    ///////////////////////////////////////////////////////////////
    // Standard drawing board functionalities
    ///////////////////////////////////////////////////////////////

    var colors = ["black", "red", "green", "blue", "yellow", "magenta", "white"];
    var canvas = $("#canvas");
    var colorElement = $("#color");
    for (var i = 0; i < colors.length; i++) {
        colorElement.append(
            "<option value='" + (i + 1) + "'>" + colors[i] + "</li>"
        );
    }
    var buttonPressed = false;
    canvas
        .mousedown(function () {
            buttonPressed = true;
        })
        .mouseup(function () {
            buttonPressed = false;
        })
        .mousemove(function (e) {
            if (buttonPressed) {
                setPoint(e.offsetX, e.offsetY, colorElement.val());
            }
        });

    var ctx = canvas[0].getContext("2d");
    function setPoint(x, y, color) {
        ctx.fillStyle = colors[color-1];
        ctx.beginPath();
        ctx.arc(x, y, 2, 0, Math.PI * 2);
        ctx.fill();
    }
    function clearPoints() {
        ctx.clearRect(0, 0, canvas.width(), canvas.height());
    }

    $("#clear").click(function () {
        clearPoints();
    });

    ///////////////////////////////////////////////////////////////
    // SignalR specific code
    ///////////////////////////////////////////////////////////////

    var hub = $.connection.drawingBoard;
    hub.state.color = colorElement.val(); // Accessible from server
    var connected = false;

    // UI events
    colorElement.change(function () {
        hub.state.color = $(this).val();
    });
    canvas.mousemove(function (e) {
        if (buttonPressed && connected) {
            hub.server.broadcastPoint(
                Math.round(e.offsetX), Math.round(e.offsetY)
            );
        }
    });
    $("#clear").click(function () {
        if (connected) {
            hub.server.broadcastClear();
        }
    });

    // Event handlers
    hub.client.clear = function () {
        clearPoints();
    };
    hub.client.drawPoint = function (x, y, color) {
        setPoint(x, y, color);
    };
    hub.client.update = function (points) {
        if (!points) return;
        for (var x = 0; x < 300; x++) {
            for (var y = 0; y < 300; y++) {
                if (points[x][y]) {
                    setPoint(x, y, points[x][y]);
                }
            }
        }
    };

    // Voila!
    $.connection.hub.start()
        .done(function () {
            connected = true;
        });

});

展现文件就证实配置成功了。文件里证实了代办的js‘类’;

  js中有关本文宗旨代码表述:

 

   var hub =
$.connection.drawingBoard;  固定写法,制造集线器代理工科具(此处只可以意会)

在客商端按梯次引进JQuery、signalr。最后引进<script
src=”/signalr/hubs”></script>

   hub.state.color = colorElement.val(卡塔尔(英语:State of Qatar); //  
画笔颜料参数,形似于url传递querystring 参数,可查看下文中C#代码通晓

那般贰个文件,因为它是动态变化的,所以看不见,那么些正是以前测验所在的文本集;

   var connected = false;  //状态标记

接下去就足以写js代码了:

   hub.state.color = $(this卡塔尔(英语:State of Qatar).val(卡塔尔国; //设置参数值,同上文

var
proxy=$.connection.chatName;个中chatName是您集线器的名号。那样就获得了hub代理成员。

   hub.server.broadcastPoint(Math.round(e.offsetX卡塔尔国,
Math.round(e.offsetY卡塔尔卡塔尔国;  //调用服务器端的服务方式  布罗兹castPoint
 ,在花瓣上打字与印刷二个点

此地本人测量检验的是hub的名字首字母是小写的,大写的会找不到,具体的能够透过”/signalr/hubs”这么些渠道找。

*  注脚:服务端的办法在web端调取时候须要首先个字幕小写起来,详细的情况请自行百度*

 

*  * hub.server.broadcastClear(卡塔尔;  //调用服务端清空画板服务方法

proxy.client.addMessage(function(){

   hub.client.clear = function () {

alert(“对了”);

    clearPoints(卡塔尔国;   //顾客端扫除
   };

});

   hub.client.drawPoint

//这里是挂号客户端的点子,让服务端调用,也正是事前新建的hub。

   hub.client.update   

 

*    注明:以上两条请参见上文中解释*

$.connection.hub.start().done(function(){

*   *$.connection.hub.start(卡塔尔(قطر‎    //先导创建链接

$(“#btn”).click(function(){

    .done(function (卡塔尔 {  //暂忘记了
      connected = true;
    });

proxy.server.hello();

四、增添运营类

});

  根目录下增多  Startup.cs文件,代码如下:

});

  

//start是开启连接,done是展开连接成功后的回调函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Owin;

namespace Test
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

//在此个回调函数中调用了劳动端hello方法。

  申明: app.MapSignalENCORE(卡塔尔(英语:State of Qatar);用于注册暗中认可服务

内部服务段方法为

五、添加Hub服务

public void Hello()
        {
            Clients.All.addMessage();

        }

  根目录下增添DrawingBoard.cs  代码如下:

  在服务端又调用了客商端的点子,addMessage就是登记在服务端的主意。

*  *

 

using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;

namespace DrawingBoard
{
    public class DrawingBoard : Hub
    {
        private const int BoardWidth = 300, BoardHeight = 300;
        private static int[,] _buffer = GetEmptyBuffer();
        public Task BroadcastPoint(int x, int y)
        {
            if (x < 0) x = 0;
            if (x >= BoardWidth) x = BoardWidth - 1;
            if (y < 0) y = 0;
            if (y >= BoardHeight) y = BoardHeight - 1;

            int color = 0;
            int.TryParse(Clients.Caller.color, out color);
            _buffer[x, y] = color;
            return Clients.Others.DrawPoint(x, y, Clients.Caller.color);
        }
        public Task BroadcastClear()
        {
            _buffer = GetEmptyBuffer();
            return Clients.Others.Clear();
        }

        public override Task OnConnected()
        {
            return Clients.Caller.Update(_buffer);
        }

        private static int[,] GetEmptyBuffer()
        {
            var buffer = new int[BoardWidth, BoardHeight];
            return buffer;
        }
    }
}
$.connection 拿到建立的这个连接。
$.connection.hubName 拿到连接里对应的hub对象
$.connection.hubName.client 拿到客服端对象。
$.connection.hubName.server 拿到服务端对象。

  逻辑并不复杂,就是转账客商端传递进入的数码给其他顾客端,请自行精晓。

 

 

开发中遇到的难题:

  配置错误,初步时候使用web.config配置,开掘报错了切实错误已经抛弃,开掘是 Startup
 配置错误,Startup.cs可以致时为私下认可的必得的留存的。预计能够选拔web.config配置为别的运转类,但是未测量检验。

  具体请关怀后续文章。

运作效果图:

  图片 1

  

请小心:本文中代码摘自ASP.NET
 Signal传祺 编制程序实行风华正茂书
豆瓣链接:

相关文章