详解SignaIR实现.net framework框架平台下实现向客户端的消息推送,跨域配置

一开始没找到官方正式的资料,文档页,网上资料良莠不齐,大部分都是道听途说,一知半解,博主也是一样,但是仔细思考,这一块的知识非常重要,

以及时消息推送,应用场景非常广泛,聊天室,监测等等方面,博主非常重视,额外当然也是工作中小组组长的要求,让知识方面搞透彻,基本原理,因此没有得过且过,

尽力思考如何优化,如何更好,功夫不负苦心人,终于找到官方文档,心中更有底,

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client

工具 -> 库程序包管理器 -> 程序包管理器控制台 输入下面命令
//install-package Microsoft.AspNet.SignalR -Version 2.4.1

 

 

分为几大快,其实都十分重要,仔细看相关内容,几乎可以根据需要,回答以上各种问题,闲话少叙,上代码!

分为Signalr1.x版本和Signalr2.x版本

先看2.x版本后端如下

 

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

[assembly: OwinStartup(typeof(SignalrDemo.SignaIR.Startup))]
工具 -> 库程序包管理器 -> 程序包管理器控制台 输入下面命令
//install-package Microsoft.AspNet.SignalR -Version 2.4.1
namespace SignalrDemo.SignaIR
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888
            app.MapSignalR("/signalr", new HubConfiguration() { EnableJSONP =true});
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Microsoft.AspNet.SignalR;

namespace SignalrDemo.SignaIR
{
    public class ServerHub : Hub
    {
        private static readonly char[] str =
        {
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
            'v',
            'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
            'V',
            'W', 'X', 'Y', 'Z'
        };

        /// <summary>
        /// 消息发送接口
        /// </summary>
        /// <param name="message"></param>
        public void SendMsg(string message)
        {
            var name = GenerateUserName(4);
            // 调用所有客户端的sendMessage方法
            Clients.All.sendMessage(name, message);
        }

        /// <summary>/// 产生随机用户
        /// </summary>
        /// <param name="length">用户名长度</param>
        /// <returns></returns>
        ///
        public static string GenerateUserName(int length)
        {
            var newRandom = new StringBuilder(62);
            var rd = new Random();
            for (var i = 0; i < length; i++)
            {
                newRandom.Append(str[rd.Next(62)]);
            }

            return newRandom.ToString();
        }
    }
}

代码量并不大 ,

1.x版本如下

 后端代码: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
//工具 -> 库程序包管理器 -> 程序包管理器控制台 输入下面命令
//install-package Microsoft.AspNet.SignalR -Version 1.1.4
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace SignalR.Controllers
{
    [HubName("allHub")]
    //所有 hub
    public class TAllHub : Hub
    {

    }
    public class BaseController : Controller
    {
        //广播
        public string fnBroadcast(string msg)
        {
            try
            {
                IHubContext chat = GlobalHost.ConnectionManager.GetHubContext<TAllHub>();
                chat.Clients.All.notice("发送内容:" + msg);//向所有组发送
                return "发送成功!";
            }
            catch (Exception e)
            {
                return "发送失败!\n失败原因:\n" + e.Message;
            }
        } 
        public ActionResult Broadcast()
        {
            return View();
        }        
    }
}

2.x前端部分代码:添加跨域



<h2>Index</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>


<script src="Scripts/jquery-1.6.4.min.js"></script>
<!--引用SignalR库. -->
<script src="Scripts/jquery.signalR-2.4.1.min.js"></script>
<!--引用自动生成的SignalR 集线器(Hub)脚本.在运行的时候在浏览器的Source下可看到 -->
<script src="https://localhost:44322/signalr/hubs"></script>

<script>
    $(function () {
        $.connection.hub.url = "https://localhost:44322/signalr";
        // 引用集线器代理
        var chat = $.connection.serverHub;
        // 定义服务器端调用的客户端sendMessage来显示新消息

        chat.client.sendMessage = function (name, message) {
            // 向页面添加消息
            $('#discussion').append('<li><strong>' + htmlEncode(name)
                + '</strong>: ' + htmlEncode(message) + '</li>');
        };
        $.connection.hub.logging = true;
        // 设置焦点到输入框
        $('#message').focus();
        // 开始连接服务器
        $.connection.hub.start({jsonp:true}).done(function () {
            $('#sendmessage').click(function () {
                // 调用服务器端集线器的SendMsg方法
                chat.server.sendMsg($('#message').val());
                // 清空输入框信息并获取焦点
                $('#message').val('').focus();
            });
        });
        $.connection.hub.disconnected(() => {
            console.log($.connection.hub.state);
        }); 
        //服务器中断,自动执行这个方法reconnect5次,ping2次,poll1次,会多次执行,大概四次执行,回调断开连接,执行上面的
        //
        $.connection.hub.reconnected(() => {
            console.log($.connection.hub.state);
        }); 
        $.connection.hub.error((err) => {
            console.log(err);
        }); 
    });

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

前端测试代码:Broadcast.cshtml

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head runat="server">
    <title>消息推送页面</title>
    <script src="~/Scripts/jquery-1.6.4.min.js"></script>
    <script src="~/Scripts/jquery.signalR-1.1.4.min.js"></script>
    <script src="~/signalr/hubs"></script>
</head>
<body>
    <input type="text" id="txtMess" />
    <input type="button" value="发送广播消息" id="btnPush" />
    <script>
            (function () {
                $("#btnPush").click(function () {
                    console.log($.connection.hub.state);
                    var $mess = $("#txtMess");
                    $.ajax({
                        url: "../Base/fnBroadcast",
                        data: { msg: $mess.val() },
                        type: "post",
                        dataType: "text",
                        success: function (result) {
                            if (result.indexOf("成功") !== -1) {
                                $mess.val("");
                            }
                        }
                    });
                });              
                //allHub对应后台的 类 AllHub,开头字母不能大写,除非加上别名[HubName("")]
                var allHub = $.connection.allHub,timer=null;
                allHub.client.notice = function (msg) {
                    $("body").append("<br/><br/>" + msg);
                }                  
                function hubstart() {                  
                    try {
                        $.connection.hub.start();                      
                    } catch (err) {
                        console.log(err);
                        setTimeout(() => hubstart(), 5000);
                    }                                                                  
                };
                hubstart();
                //心跳检测,重新连接超过指定次数,或是时间后可放弃
                //{connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}
                function Heart() {                    
                    if ($.connection.hub.state != 1) {                       
                        hubstart();
                    }
                    else {
                        timer = null;
                    }
                }                                               
                $.connection.hub.disconnected(() => {
                    timer = setTimeout(() => Heart(), 5000);                  
                });          
                           
        })();
    </script>
</body>
</html>

最后有图有真相:

重要的事情说三遍,重视官方文档,尽量查官方文档,即权威专业又节约时间, 

重要的事情说三遍,重视官方文档,尽量查官方文档,即权威专业又节约时间, 

重要的事情说三遍,重视官方文档,尽量查官方文档,即权威专业又节约时间, 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值