跨域通俗理解就是两个域名后面的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服务地址,绑定$.connection.notifyHub
*/
function bindNotifyServier() {
var url = "";
mwc.restApi.post({
//请求地址
url: '/Home/GetNotifyUrl',
//是否锁定UI
isBlockUI: true,
//成功函数
success: function (data) {
console.log("获取推送消息地址:" + data.NotifyUrl);
url = data.NotifyUrl;
initData(url);
}
});
} /** 初始化数据
*/
function initData(notifyUrl) {
//获取消息集线器对象 $.connection.hub.url = notifyUrl;
var notifyHubProxy = $.connection.notifyHub;
notifyHubProxy.client.Notify = function (notify) {
console.log('收到消息:' + notify);
$notfiy = JSON.parse(notify);
speckText($notfiy.Message);
if (typeof (notify.length) != 'undefined') {
vm.Notifies.push($notfiy);
console.log('压入消息');
return;
}
var hasExist = false;
//是否已存在此消息
$.each(vm.Notifies, function (i, v) {
if (v.Id == notify.Id) {
vm.Notifies.splice(i, , $notfiy)
hasExist = true;
return;
}
});
//如果不存在则添加
if (!hasExist) {
vm.Notifies.push($notfiy);
if (vm.Notifies.length > )
vm.Notifies.splice(, )
}
console.debug(vm.Notifies);
};
$.connection.hub.start({ transport: ['webSockets', 'longPolling'] }).done(function () {
console.debug('已成功连接服务器!');
}).fail(function () { console.log('连接失败!'); });
};

后台推送代码:

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

示例图:

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

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

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

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

Signalr指定Websocket方式跨域数据传输的更多相关文章

  1. jquery、javascript实现(get、post两种方式)跨域解决方法

    一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(function(){ $.ajax({ url: "http://www.xxx ...

  2. window.name实现的跨域数据传输 JavaScript跨域总结与解决办法

    原文地址:  http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html#m4 什么是跨域 1.document.domain+ifr ...

  3. window.name 跨域数据传输

    通过window.name可以实现跨域数据传输. 要解决的功能:  www.a.com/a.html 需要获取到 www.b.com/b.html页面内容的数据 需要3个页面 www.a.com/a. ...

  4. 配置Nginx和Apache允许指定域名CORS跨域访问

    前后端分离开发,导致前端项目需要跨域请求后端接口,解决方法有很多,本文只介绍两个: 1. 修改后端程序代码实现允许跨域请求 2. 修改服务器配置文件实现允许跨域请求 正文: 方法1:修改后端程序代码实 ...

  5. window.name实现的跨域数据传输

    这篇文章是对 JavaScript跨域总结与解决办法 的补充. 有三个页面: a.com/app.html:应用页面. a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件 ...

  6. 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

    客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...

  7. javascript跨域通信(二):window.name实现的跨域数据传输

    首先了解一下window.name这个东西是什么. name 在浏览器环境中是一个全局/window对象的属性,当在 frame 中加载新页面时,name 的属性值依旧保持不变 并且name 属性仅对 ...

  8. 使用CORS方式跨域

    什么是CORS CORS(Cross-Origin Resource Sharing 跨源资源共享),当一个请求url的协议.域名.端口三者之间任意一与当前页面地址不同即为跨域. ===前端 不需要携 ...

  9. POST方式跨域上传文件

    JSONP请求有限制: 第一,不能跳出两层, 第二,不支持POST. 往往解决跨域POST请求的方案是个"古老"方法, 请求同域下的iframe. 服务器端:  需要附加头信息: ...

随机推荐

  1. 安装使用eclipse

    安装使用eclipse 目标 java学习需要,老师说要安装eclipse,,其实已经下了IDEA了,不过还是听老师的比较好( 准备 jre 也就是java运行环境,因为之前就下了jdk(里面包含jr ...

  2. ionic3+angular4开发混合app 之自定义组件

    这里主要是记录ionic3+angular4开发混合app时自定义组件,我想自定义组件的方法和angular4应该类似,具体在纯angular4中自定义组件,暂时没有实践,个人觉得差别不大,之后实践了 ...

  3. 我的第一次做app的细节

    第一次做一个app 发现 需要和前端沟通好而且 还要注意细节  效果图细节不要忘记 尽量多穿数据不要少传数据 而且 对接 注意细节

  4. EDI

    EDI, Electronic Data Interchange,电子数据交换 EDI 商务是指将商业或行政事务按一个公认的标准,形成结构化的事务处理或文档数据格式,从计算机到计算机的电子传输方法.简 ...

  5. 电子科技大学实验中学PK赛(一)比赛题解

    比赛来源:第十四届重庆大学程序设计大赛暨西南地区高校邀请赛现场初赛 比赛地址:http://qscoj.cn/contest/24/ A. Comb 自述 分析:统计ACM在题目描述中出现的次数,认真 ...

  6. 在线生成透明ICO图标神器

    此神器的链接为:http://ico.duduxuexi.com/ 大家可以将这个网址收藏好,本人亲测十分好用!对我们的ios,安卓以及windows开发都有极大的好处.

  7. 【RL-TCPnet网络教程】第9章 RL-TCPnet网络协议栈移植(uCOS-III)

    第9章        RL-TCPnet网络协议栈移植(uCOS-III) 本章教程为大家讲解RL-TCPnet网络协议栈的uCOS-III操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移 ...

  8. 深入理解Spring Redis的使用 (六)、用Spring Aop 实现注解Dao层的自动Spring Redis缓存

    摘要: 主要针对Dao层的一些数据库查询的操作,数据实时性不强,直接加入缓存.当缓存中有的时候,就使用缓存中的数据.这样的方法,最终仅仅使用一个注解实现.对于之前的hibernate二级缓存使用,比较 ...

  9. ansible基础-理解篇

    1. 介绍 要说现在的部署工具,ansible可以说家喻户晓了. ansible是一个开源软件,用于软件供应.配置管理.应用部署.ansible可以通过SSH.remote PowerShell.其他 ...

  10. 12.Git分支-推送(push)、跟踪分支、拉取(pull)、删除远程分支

    1.推送 本地的分支并不会自动与远程仓库同步,你可以显示的向远程仓库推送你的分支.例如你在本地创建了一个dev分支,你想其他的人和你一样在dev之下进行工作,可以使用 git push <rem ...