SignalR框架

SignalR介绍

Http 协议是浏览器端主动发起请求,服务器不能主动发起请求。有一些场景下需要服务器主动通知浏览器端,比如网站即时消息、审核通知、系统报警。可以使用Ajax 长连接来解决,但是对于Web 服务器的压力太大,尽量别用。如果浏览器端支持WebSocket(基本上现代浏览器都支持),那么可以利用WebSocket 实现,性能非常高。

使用原生WebSocket 开发难度比较高,微软提供了一个高度封装的框架SignalR,简化了Websocket 开发。如果浏览器端支持WebSocket 就用Websocket,否则就使用长连接,代码不变。
SignalR 在Windows7、Windows 2008 下作为服务器也可以正常调试运行,但是是用长连接的,服务器端只有在Windows8 及以上(不会用作服务器系统)、Windows 2012 及以上才支持WebSocket , 服务器端的WebSocket 支持如果没安装还需要安装
https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-s
upport
总结:浏览器端支持Html5 WebSocket 并且服务器端为Windows 2012 及以上才支持WebSocket,否则性能惨死!

SignalR 基本使用

第一步:创建一个MVC项目(也可以是WebForm项目,或者是一个独立的类库项目然后搭配MVC或者WebForm项目使用,这里我就直接在MVC项目中搞了)

第二步:在这个MVC项目中添加新建项,选择SignalR集线器类(v2),类的名字就叫:MyHub2.cs吧,类中默认是以下内容

public class MyHub1 : Hub
{
    public void Hello()
    {
        Clients.All.hello();
    }
}

我们可以改动内容,比如改成如下内容:

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

namespace SignalRApp
{
    public class MyHub : Hub
    {
        //这个方法名字是自定义的。参数也是自定义的
        public void SendMessage(string name, string msg)
        {
            //All表示监听所有连接上来的客户端。
            //onMessage是一个动态的方法,名字我们可以随意定的。这里我仅仅是给他取名叫onMessage而已,我们也可以叫Clients.All.ABC();
            Clients.All.onMessage(name + "和大家说:" + msg);//调用所有连接上来的客户端(包括自己)监听的onMessage事件。All是一个dynamic属性,所以可以随意的监听


            var clientConnectionId = Context.ConnectionId; //这是与我连接的客户端的连接ID(浏览器端)

            //我们还可以利用QueryString类接收数据
            string userName = Context.QueryString["userName"];
            string password = Context.QueryString["password"];
        }

        //重写父类OnConnected方法  :客户端连接上的时候会调用此方法
        public override Task OnConnected()
        {
            return base.OnConnected();
        }

        //重写父类OnDisconnected方法 :OnConnected方法客户端断开连接的时候会调用此方法
        public override Task OnDisconnected(bool stopCalled)
        {
            return base.OnDisconnected(stopCalled);
        }

        //重写父类OnReconnected方法  : 客户端可能网络不稳定,造成重新连接,就会调用此方法
        //注意:客户端(浏览器页面)在刷新的时候不属于重连接,刷新是属于先断开连接,然后再连接
        public override Task OnReconnected()
        {
            return base.OnReconnected();
        }
    }
}

第三步:在项目中添加新建项,选择OWIN Startup类,默认名字就叫Startup1.cs。内容如下:

namespace SignalRApp
{
    public class Startup1
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888

            //我在这里添加一行代码:意思是:将 SignalR 集线器映射到“/signalr”处的应用生成器管道。
            app.MapSignalR();
        }
    }
}

第四步:在项目中添加一个mvc 的View 页面Index.cshtml,或者静态页,我这里直接就添加了一个html静态页吧,取名MyIndex.html

在页面中引入三个文件

<script src="/Scripts/jquery-1.10.2.js"></script>
<script src="/Scripts/jquery.signalR-2.1.2.js"></script>
<!--这是一个由 SignalR 处理的路径,先不管能不能找到这个文件,我们姑且这样写,程序运行的时候它会自动加载进来-->
<script src="/signalr/hubs" type="text/javascript"></script> 

具体的代码如下

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <meta charset="utf-8" />
    <script src="/Scripts/jquery-1.10.2.js"></script>
    <script src="/Scripts/jquery.signalR-2.1.2.js"></script>
    <script src="/signalr/hubs" type="text/javascript"></script> <!--这是一个由 SignalR 处理的路径-->

</head>
<body>
    <input type="button" id="btn1" value="提交"/>
    <script type="text/javascript">
        $(function () {
            //监听来自服务器端对onMessage的调用。注意是client  (这段意思是:当服务器向我发送onMessage这个消息的时候,执行这个funtion(msg)这个匿名函数)  
            //注意:不管项目中声明的SignalR集线器类的名字的首字母是大写还是小写,这的名字都必须是小写开头
            //例如:我的SignalR集线器类的名字叫MyHub.cs 这里必须写成myHub
            $.connection.myHub.client.onMessage = function (msg) { //注意,这一步一定要在 $.connection.hub.start()之前执行
                alert("消息来了:"+msg)
            }
            //我们还可以利用QueryString传递收数据(数据必须在$.connection.hub.start()方法之前设置)一般用于传递一些用户的认证信息,例如用户名,密码,Token,它是属于全局的
            $.connection.hub.qs = { userName: "张三", password: "123456" };

            $.connection.hub.start().done(function () {
                alert("连接MyHub成功");
            }).fail(function () { alert("连接MyHub失败") });
            $("#btn1").click(function () {
                //注意:不管项目中声明的SignalR集线器类的中的方法名字的首字母是大写还是小写,这的名字都必须是小写开头
                //例如:我的SignalR集线器类的名字叫MyHub.cs 它里面声明了一个SendMessage方法,这里必须写成sendMessage
                $.connection.myHub.server.sendMessage("小米", "我上市啦");
            })
        })
    </script>
</body>
</html>

运行这个项目

猜你喜欢

转载自blog.csdn.net/Fanbin168/article/details/81079986