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代码:
/**
获取后台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方式跨域数据传输的更多相关文章
- jquery、javascript实现(get、post两种方式)跨域解决方法
一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(function(){ $.ajax({ url: "http://www.xxx ...
- window.name实现的跨域数据传输 JavaScript跨域总结与解决办法
原文地址: http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html#m4 什么是跨域 1.document.domain+ifr ...
- window.name 跨域数据传输
通过window.name可以实现跨域数据传输. 要解决的功能: www.a.com/a.html 需要获取到 www.b.com/b.html页面内容的数据 需要3个页面 www.a.com/a. ...
- 配置Nginx和Apache允许指定域名CORS跨域访问
前后端分离开发,导致前端项目需要跨域请求后端接口,解决方法有很多,本文只介绍两个: 1. 修改后端程序代码实现允许跨域请求 2. 修改服务器配置文件实现允许跨域请求 正文: 方法1:修改后端程序代码实 ...
- window.name实现的跨域数据传输
这篇文章是对 JavaScript跨域总结与解决办法 的补充. 有三个页面: a.com/app.html:应用页面. a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件 ...
- 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)
客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...
- javascript跨域通信(二):window.name实现的跨域数据传输
首先了解一下window.name这个东西是什么. name 在浏览器环境中是一个全局/window对象的属性,当在 frame 中加载新页面时,name 的属性值依旧保持不变 并且name 属性仅对 ...
- 使用CORS方式跨域
什么是CORS CORS(Cross-Origin Resource Sharing 跨源资源共享),当一个请求url的协议.域名.端口三者之间任意一与当前页面地址不同即为跨域. ===前端 不需要携 ...
- POST方式跨域上传文件
JSONP请求有限制: 第一,不能跳出两层, 第二,不支持POST. 往往解决跨域POST请求的方案是个"古老"方法, 请求同域下的iframe. 服务器端: 需要附加头信息: ...
随机推荐
- 算法第四版中 while (!StdIn.isEmpty()) 循环无法跳出问题
在IDEA中使用Ctrl+D就可以退出console输入
- 常用的Tensor操作
常用的Tensor操作 1.通过tensor.view方法可以调整tensor的形状,但必须保证调整去前后元素总数一致.view不会修改自身的数据,返回新的tensor与原tensor共享内存,即更改 ...
- leetcode-只出现一次的数字
题目:只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? ...
- JAVA_AesCBC纯净例子
import java.io.UnsupportedEncodingException; import java.security.InvalidAlgorithmParameterException ...
- Android系统架构及内核简介
(来源于ThinkPHP) Android是Google公司开发的基于Linux平台的开源手机操作系统,它包括操作系统.中间件.用户界面和应用程序,而且不存在任何以往阻碍移 动产业创新的专利权障碍,并 ...
- Django 简单的使用
1.创建一个名字为 two 的项目 并 进入项目 2.创建一个 app 3.更改语言和时间 4,注册APP 5.模板创建和设置 设置模板查找的路径 6,然后我们开始设置 路由映射 主项目映射 然后我们 ...
- 使用AOP实现方法执行时间和自定义注解
环境:IDEA2018+JDK1.8+SpringBoot 第一步:在pom文件中引入依赖(度娘有很多(*^▽^*)): <!--引入AOP的依赖--><dependency> ...
- 老司机带路:《axios从入门到开车 嘀嘀~~》
前言:axios vue.axios 跨域.axios.js.axios get.axios post.axios中文文档 之前当vue更新到2.0之后,作者就宣告不再对vue-resource更新, ...
- #Java学习之路——基础阶段(第七篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- [SQL]LeetCode196. 删除重复的电子邮箱 | Delete Duplicate Emails
Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...