欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Signalr指定Websocket方式跨域数据传输

程序员文章站 2022-04-18 22:18:36
跨域通俗理解就是两个域名后面的web服务地址,即都是独立的网站。现实业务的情况会有很多需要跨域推送数据的情况, 比如类似饿了么商户后台会收到客户端确认订单后,后台服务会推送一条订单消息给商户前台。 Signalr跨域代码: 前台js代码: 1 /** 2 获取后台Signalr服务地址,绑定$.co ......

 

跨域通俗理解就是两个域名后面的web服务地址,即都是独立的网站。现实业务的情况会有很多需要跨域推送数据的情况,

比如类似饿了么商户后台会收到客户端确认订单后,后台服务会推送一条订单消息给商户前台。

Signalr跨域代码:

   public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
            try
            {
                Air.Log.Logger.Default.Trace("配置signalr");      
                //新增管道异常处理模块            
                GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());
                GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule());             
                app.Map("/WebApiSignalr", map =>
                {
                    //支持跨域
                    map.UseCors(CorsOptions.AllowAll);
                    var hubConfiguration = new HubConfiguration
                    {
                        // You can enable JSONP by uncommenting line below.
                        // JSONP requests are insecure but some older browsers (and some
                        // versions of IE) require JSONP to work cross domain
                        // EnableJSONP = true
                        EnableJSONP = true,
                        EnableDetailedErrors = true
                    };
                    map.RunSignalR(hubConfiguration);
                });
                Air.Log.Logger.Default.Trace("配置signalr完毕");
            }
            catch (Exception ea)
            {
                Air.Log.Logger.Default.Error("Startup异常", ea);
            }
        }
    }

前台js代码:

Signalr指定Websocket方式跨域数据传输
 1     /**
 2               获取后台Signalr服务地址,绑定$.connection.notifyHub
 3             */
 4             function bindNotifyServier() {       
 5                 var url = "";
 6                 mwc.restApi.post({
 7                     //请求地址
 8                     url: '/Home/GetNotifyUrl',
 9                     //是否锁定UI
10                     isBlockUI: true,
11                     //成功函数
12                     success: function (data) {
13                         console.log("获取推送消息地址:" + data.NotifyUrl);
14                         url = data.NotifyUrl;
15                         initData(url);
16                     }
17                 });          
18             }
19 
20     /** 初始化数据
21             */
22             function initData(notifyUrl) {
23                 //获取消息集线器对象    
24                 
25                 $.connection.hub.url = notifyUrl;
26                 var notifyHubProxy = $.connection.notifyHub;             
27                 notifyHubProxy.client.Notify = function (notify) {
28                     console.log('收到消息:' + notify);
29                     $notfiy = JSON.parse(notify);
30                     speckText($notfiy.Message);
31                     if (typeof (notify.length) != 'undefined') {
32                         vm.Notifies.push($notfiy);
33                         console.log('压入消息');
34                         return;
35                     }
36                     var hasExist = false;
37                     //是否已存在此消息
38                     $.each(vm.Notifies, function (i, v) {
39                         if (v.Id == notify.Id) {
40                             vm.Notifies.splice(i, 1, $notfiy)
41                             hasExist = true;
42                             return;
43                         }
44                     });
45                     //如果不存在则添加
46                     if (!hasExist) {
47                         vm.Notifies.push($notfiy);
48                         if (vm.Notifies.length > 8)
49                             vm.Notifies.splice(7, 1)
50                     }
51                     console.debug(vm.Notifies);
52                 };
53                 $.connection.hub.start({ transport: ['webSockets', 'longPolling'] }).done(function () {
54                     console.debug('已成功连接服务器!');
55                 }).fail(function () { console.log('连接失败!'); });
56             };
View Code

 

 

后台推送代码:

1      var notifier = NotifyManager.Current.Notifier;
2                         VmSiteNotify vmNotify = new VmSiteNotify();                         
3 vmNotify.Message = "测试下!"; 4 vmNotify.Title = "测试推送"; 5 notifier.NotifyTo(vmNotify, user.RoleId.ToString());

 

示例图:

Signalr指定Websocket方式跨域数据传输

如上图 的方式就是方式为websocket,查看通讯方式是不是websocket就看http请求的Requet Headers下是不是有上图红框框下圈中的信息。

这里要留意上面js的代码,我是写了这样一段:$.connection.hub.start({ transport: ['webSockets', 'longPolling'] }) 

这一段的意思就是优先websocket的通讯方式,不然感觉我的实际环境支持websocket实际上浏览器的调试结果告诉我也是走的其他通讯方式。

所以最好在start时候明确通讯方式,上面js的意思是优先websocket再是长轮询。