Signalr指定Websocket方式跨域數據傳輸


 

跨域通俗理解就是兩個域名后面的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代碼:

 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());

 

示例圖:

如上圖 的方式就是方式為websocket,查看通訊方式是不是websocket就看http請求的Requet Headers下是不是有上圖紅框框下圈中的信息。

這里要留意上面js的代碼,我是寫了這樣一段:$.connection.hub.start({ transport: ['webSockets', 'longPolling'] }) 

這一段的意思就是優先websocket的通訊方式,不然感覺我的實際環境支持websocket實際上瀏覽器的調試結果告訴我也是走的其他通訊方式。

所以最好在start時候明確通訊方式,上面js的意思是優先websocket再是長輪詢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM