【发布时间】:2015-09-23 22:43:00
【问题描述】:
在 IE 11 中使用 signalR 时会发生奇怪的行为。场景:
我们有一些调度器类型的功能,调度器执行一些操作,而其他用户可以实时查看更新(查询)。发送的参数很好,无需打开开发者控制台即可在 IE 客户端更新。
但是一种不起作用的方法(performUpdate - 获取查询结果 - 这是服务器 > 客户端调用,而不是客户端 > 服务器 > 客户端) - 永远不会被调用。只有在开发人员控制台打开时才会调用它。
这是我尝试过的:
Why JavaScript only works after opening developer tools in IE once?
SignalR : Under IE9, messages can't be received by client until I hit F12 !!!!
SignalR client doesn't work inside AngularJs controller
一些代码sn-ps
调度方
在下拉更改时,我们会获取当前选择的值并通过网络发送更新。 (这很好用)。
$('#Selector').on('change', function(){
var variable = $('#SomeField').val();
...
liveBatchHub.server.updateParameters(variable, ....);
});
服务器端
当调度程序搜索时,我们有一些服务器端代码会发出搜索已运行的通知,并告诉客户端拉取结果。
public void Update(string userId, Guid bId)
{
var context = GlobalHost.ConnectionManager.GetHubContext<LiveBatchViewHub>();
context.Clients.User(userId).performUpdate(bId);
}
客户端(实时更新的查看者)
除非开发人员工具打开,否则永远不会调用它
liveBatchHub.client.performUpdate = function (id) {
//perform update here
update(id);
};
编辑
更多可能有用的信息(我不确定它为什么会有所不同)但这似乎只发生在我进行服务器 > 客户端调用时。当调度程序更改搜索参数时,更新为客户端>服务器>客户端或调度程序客户端>服务器>查看器客户端,这似乎有效。在他们单击搜索后,搜索管道中的服务会调用performUpdate 服务器端(服务器> 查看器-客户端)。不确定这是否重要?
编辑 2 和最终解决方案
眼睛布满血丝,我意识到我遗漏了这个问题的一个关键部分:我们在这个页面上也使用了 angular。我想我已经盯着它太久了,把它漏掉了——对不起。我授予 JDupont 答案是因为他走在了正确的轨道上:缓存。但不是 jQuery 的 ajax 缓存,angulars $http。
为了让其他人不必花费数日/夜的时间把头撞在桌子上,最终的解决方案是使用 angulars $http 禁用 ajax 调用的缓存。
取自here:
myModule.config(['$httpProvider', function($httpProvider) {
//initialize get if not there
if (!$httpProvider.defaults.headers.get) {
$httpProvider.defaults.headers.get = {};
}
// Answer edited to include suggestions from comments
// because previous version of code introduced browser-related errors
//disable IE ajax request caching
$httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
// extra
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);
【问题讨论】:
-
您是否收到控制台错误?
-
没有显示控制台错误
-
您的应用是否引用了 JSON2?如果是,是否在引用 signalR.min.js 之前进行了引用?
-
确保浏览器链接已启用。
-
您的 js(客户端(实时更新查看器))代码中是否有任何基于控制台的功能(如 Console.log)?在打开开发控制台之前,这些功能在 IE 中不起作用,并且可能导致您的代码中断。
标签: asp.net-mvc internet-explorer iis signalr