zoukankan      html  css  js  c++  java
  • 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再是长轮询。

  • 相关阅读:
    de1ctf_2019_weapon
    ciscn_2019_s_6
    用 Blend 给Windows Phone 应用创建 示例数据
    (转) Wp7 list 中列表项多样化的解决方案-Custom DataTemplateSelector
    Android开发之Java集合类性能分析
    WriteableBitmap 给透明的控件截图的问题
    VS 2013 配置OpenCV
    Cocos2d-x 版本小游戏 《是男人就下100层》 项目开源
    HEAP CORRUPTION DETECTED :after Normal block 错误
    Visual C++ 的代码折叠
  • 原文地址:https://www.cnblogs.com/hunanzp/p/8290170.html
Copyright © 2011-2022 走看看