C# -Asp.Net.SignalR.Core之Hub

前言javascript

程序员的进步是须要环境的,良好的团队环境,良好的开发环境,会让人进步的更加快速。html

因此,我认为,若是一个程序员,在2019年还在用Visual Studio 2005开发,那么,他,大几率,不会想了解Linq是个什么东西,由于他根本用不到。java

就如同我,一直在纯Windows环境下开发,因此就对Core并非很感兴趣。jquery

所以,若是一直用Visual Studio 2013如下版本开发的话,估计他对SignalR也就没什么兴趣。git

由于咱们都有个坏习惯,用不到的就不喜欢去学习。程序员

引用SignalRgithub

闲话少叙,如今咱们开始学习SignalR。sql

首先,建立一个MVC项目,而后,咱们打开Nuget搜索SignalR,以下图:浏览器

成功引用后,咱们查看引用,会发现程序引用了不少dll,好比Owin等等;这是由于SingalR的依赖项比较多,因此,咱们也引用了比较多的DLL。服务器

接着,咱们会发现一个问题,咱们添加引用是SignalR,但实际引用进来的倒是SignalR.Core,以下图:

SignalR.Core和SignalR有什么区别呢?

咱们上网查询一下,发现,他们的差别大体上就是下面这句话。

【ASP.NET Core SignalR 不支持自动从新链接。 若是客户端已断开链接,则用户必须显式启动新链接才能从新链接。 在 ASP.NET SignalR 中,若是链接断开,SignalR 会尝试从新链接到服务器。】

差别参考ASP.NET SignalR 和 ASP.NET Core SignalR 之间的差别

Startup

SignalR引入完成了,如今咱们须要配置和使用它了。

如何配置呢?很简单。添加Startup文件,修改代码以下:

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

Startup文件包含的功能不少,这里暂时不去详解了,咱们暂时只要知道,Startup文件会在网站启动时跟着一块儿运行就能够了。

由于网站运行时会调用Startup的Configuration方法,因此,咱们在这里打开SignalR的映射——app.MapSignalR(),即网站初始化,咱们就开启了SignalR的映射。

Hub

SignalR简单的来讲,是用于一个网页即时通信的工具,既然是即时通信,那么确定就是双工——双向的。

如今咱们先来看下,【网页——>服务器】这个方向的通信。

网页向服务器发送信息

首先,咱们在服务器创建一个Hub,用来接收网页的消息。

//这里命名尽可能用小写,由于前台只认小写
[HubName("kibahub")]
public class kibahub : Hub
{  
    // 这里函数命名虽然是大写,但前台Js调用要用小写字母开头
    public void Send(string message)
    {
        var id = Context.ConnectionId;   
    }
}

代码很简单,咱们创建了一个类,并集成Hub,而后编写了一个Send方法,供页面调用。

还能够看到,咱们在类上面加了一个特性,用来显示的声明这个Hub在网页端的名称。

接下来,咱们编写网页代码,在网页中,使用JavaScript来调用这个Hub的Send方法,代码以下:

<head>
    <script src="~/Scripts/jquery-3.3.1.min.js"></script>@*优先signalR引用*@
    <script src="~/Scripts/jquery.signalR-2.4.0.js"></script>
    <script src="~/Signalr/hubs"></script>@*这个是临时生成的文件,里面保存的是咱们在服务器定义的hub生成的JavaScript代码*@
</head>
<body>
            <script type='text/javascript'> 
                //引用自动生成的代理,kibahub是HubName注解属性 
                var kibaHub = $.connection.kibahub;
                console.log("kibaHub get");
                //开始链接
                $.connection.hub.start().done(function () {
                    console.log("hub start done");
                    //客户端发送信息到服务器
                    kibaHub.server.send('kiba');
                    console.log("Send done");
                }); 
            </script> 
   
</body>
</html>

从代码中能够看到,咱们首先引用了三个js文件。

第一个没啥可说的,就是jq的文件。

第二jquery.signalR-2.4.0.js文件,是咱们在引用SignalR时,一块儿引入进来的,在Scripts文件夹下,咱们也直接引入便可。

第三Signalr/hubs个文件你们应该很奇怪,咱们项目里根本没有这个文件夹,也没有这个文件,并且这个hubs文件竟然尚未后缀名。

事实上这个文件夹和文件的确是不存在的,由于,它们是在咱们运行网站时,才会生成的临时文件。目前先不去管他是什么,咱们只要知道,须要这个引用就能够了。

接下来,咱们看下JavaScript代码。

在js代码里,咱们经过$.connection.kibahub这样一句话就获取到了服务器的kibahub类的实例了,而后,咱们只要调用它的Send方法就能够了。

可是在调用以前,咱们须要先链接一下服务器。因此就有了这么一句话 $.connection.hub.start()。

到此,网页向服务器发送数据已经编写完成了,下面咱们运行网站,在浏览器中按下F12进入调试模式,而后选择Console(控制台)来查看咱们的输出内容。

如上图所示,咱们的SignalR成功的向服务器发出了信息。

服务器向网页发送信息

网页请求已经发送成功了,如今咱们开始编写服务器向网页发送信息。

首先,咱们在kibahub类的Send方法里稍做修改,代码以下。

public void Send(string message)
{
    var id = Context.ConnectionId; 
    IHubContext context = GlobalHost.ConnectionManager.GetHubContext<kibahub>();
    context.Clients.Client(id).getmessage("518"); 
}

能够看到,咱们在Send方法中获取了当前链接的惟一标识ConnectionId,而后咱们利用这个ConnectionId找到他对应的Client客户端。

在经过Client客户端调用网页中JavaScript定义的函数getmessage,并向他发送信息518。

这样服务端的代码就编写完成了。

但咱们会发现,咱们好像并无在网页端用JavaScript定义过函数getmessage呀。

别着急,咱们如今就去网页定义这个方法。

 <script type='text/javascript'> 
     var kibaHub = $.connection.kibahub; 
     $.connection.hub.start().done(function () {
         console.log("hub start done"); 
         kibaHub.server.send('kiba');
         console.log("Send done");
     });
     kibaHub.client.getmessage = function (message) {
         console.log("getmessage:" + message);
     };
 </script> 

如上述代码所示。咱们能够看到getmessage 已经定义好了,如今咱们在运行下网站。

如上图所示,服务成功的向客户端发出了信息。

----------------------------------------------------------------------------------------------------

到此Asp.Net.SignalR.Core就介绍完了。

框架代码已经传到Github上了,欢迎你们下载。

Github地址:https://github.com/kiba518/KibaSignalR

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文连接!
若您以为这篇文章还不错,请点击下方的推荐】,很是感谢!

相关文章
相关标签/搜索