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. 服务器端: 需要附加头信息: ...
随机推荐
- BZOJ 3864
dp of dp 我就是来贴个代码 #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a ...
- Rabin-Karp ACM训练
求解问题 寻找S中T出现的位置或次数.假设S的长度为n, T的长度为m, 通过枚举S长度为m的字串的hash值与T的hash值比较.此时使用滚动hash的优化使复杂度不为O(mn). 算法说明 滚动h ...
- 数据分析——numpy
DIKW DATA-->INFOMATION-->KNOWLEDGE-->WISDOM 数据-->信息-->知识-->智慧 爬虫-->数据库-->数据分 ...
- DevExpress内 GridControl中复选框值问题
在DevExpress的 GridControl内的复选柜勾选后,界面看到是勾选状态,但对应的DataView的值仍未变,在以下事件内处理 在对应的DataView内的 CellValueChangi ...
- java中class文件与jar文件
1. JAR 文件包 JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式.JAR 文件非常类似 ZIP 文件——准确的说, ...
- 在vue中使用sass的配置的方法
1.安装sass的依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --save-dev nod ...
- php7安装php-redis扩展
注:操作系统10.13.3 版本,其他版本的Mac系统应该也是可以的 先安装 按照顺序在命令行执行下面命令,如果当前用户权限不够的话,执行命令加上 sudo cd /usr/local/Cellar ...
- linux sqlite3 相关
数据库sqlite 1 用下载好的安装包安装 linux@ubuntu:~/sqlite3$ sudo dpkg -i libsqlite3-0_3.7.2-1ubuntu0.1_i386_1.deb ...
- python语法_模块_os_sys
os模块:提供对此操作系统进行操作的接口 os.getcwd() 获取python运行的工作目录. os.chdir(r'C:\USERs') 修改当前工作目录. os.curdir 返回当前目录 ( ...
- 依赖注入[2]: 基于IoC的设计模式
正如我们在<控制反转>提到过的,很多人将IoC理解为一种"面向对象的设计模式",实际上IoC自身不仅与面向对象没有必然的联系,它也算不上是一种设计模式.一般来讲,设计模 ...