跨域通俗理解就是两个域名后面的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. js方法实现--上传文件功能

    function createUploadForm(fileElementId, data, curFileList) { var id = new Date().getTime(); var for ...

  2. System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止

    System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止. 错误原因:输入的字符串长度超过数据库设置的长度

  3. 使用Ant Design的select组件时placeholder不生效/不起作用的解决办法

    先来说说使用Ant Design和Element-ui的感觉吧. 公司的项目开发中用的是vue+element-ui,使用了一通下来后,觉得element-ui虽然也有一些问题或坑,但这些小问题或坑凭 ...

  4. Maven工程无异常 启动没有出现Starting ProtocolHandler的原因

    这个情况可能的原因 一般来说有3种1.数据库没连接上2.注册中心没连接上3.逆向工程生成的mapper 有问题解决:哪个Maven工程出问题,就那个工程的src/main/resource目录下面添加 ...

  5. seed实验——Set-UID Program Vulnerability实验

    一.实验描述 Set-UID是Unix OS中的一个·非常重要的安全机制.当一个Set-UID程序运行的时候,它具有代码拥有者的权限.举个例子,如果代码的拥有者是root用户,那么不论任何用户运行该程 ...

  6. js-day03-事件响应和练习题

    DOM事件编程 事件驱动编程:所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 当对象处于某种状态时,可以发出一个消息通知,然 ...

  7. mysql 主从设置

    方法: 1.主服务器建立二进制日志,每产生语句或磁盘变化,写进日志 2.从服务器建立 relaylog日志 3.主服务器授权复制账号 4.从服务器利用复制账号来监听主服务器的日志 5.注意:所以的my ...

  8. 通过net time同步电脑时间

    net use \\192.168.1.112\ipc$ admin /user:admin #第一个admin是密码,第二个admin是用户名: net time \\192.168.1.112 / ...

  9. emWin洗衣机简易操作界面,含uCOS-III和FreeRTOS两个版本

    第3期:洗衣机简易操作界面 配套例子:V6-904_STemWin提高篇实验_洗衣机简易操作界面(uCOS-III)V6-905_STemWin提高篇实验_洗衣机简易操作界面(FreeRTOS) 例程 ...

  10. CS231n 第一次作业KNN中本地CIFAR10数据集的载入

    一.问题描述 网上绝大多数作业参考都是在jupyter下运行的,数据集载入过程一般如下: from cs231n.data_utils import load_CIFAR10 #导入数据集,并打印出数 ...