使用SignalR和IE 11一起出现了奇怪的行为。情况如下:
我们有一些调度程序功能,调度程序执行一些操作,其他用户可以实时看到更新(查询)。发送的参数正常传递,并在IE客户端上引起更新,而无需打开开发人员控制台。
但是唯一不起作用的方法(performUpdate
- 获取查询结果 - 这是一个服务器>客户端调用,不是客户端>服务器>客户端)- 永远不会被调用。只有当开发人员控制台打开时才会被调用。
这是我尝试过的:
为什么JavaScript只在IE中打开开发人员工具后才能工作?
SignalR:在IE9下,直到我按下F12,客户端才能接收到消息!!!
一些代码片段
调度程序端
在下拉列表更改时,我们获取当前选择的值并通过网络发送更新。(这个可以正常工作)。
$('#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调用的缓存。
摘自这里:
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';
}]);