Jac*_*ack 21 iis asp.net-mvc internet-explorer signalr
在IE 11中使用signalR时会发生奇怪的行为.场景:
我们有一些调度程序类型的功能,其中调度程序执行某些操作,而另一个用户可以实时查看更新(查询).发送的参数很好,可以在IE客户端进行更新,而无需打开开发人员控制台.
但是一个不起作用的方法(performUpdate- 获取查询结果 - 这是服务器>客户端调用,而不是客户端>服务器>客户端) - 永远不会被调用.当开发者控制台打开时,它只会得到打电话.
这是我尝试过的:
为什么JavaScript只在IE中打开开发人员工具一次后才有效?
SignalR:在IE9下,客户端无法接收消息,直到我点击F12 !!!!
一些代码片段
调度员方面
在下拉列表更改时,我们获取当前选定的值并通过网络发送更新.(这很好).
$('#Selector').on('change', function(){
var variable = $('#SomeField').val();
...
liveBatchHub.server.updateParameters(variable, ....);
});
Run Code Online (Sandbox Code Playgroud)
服务器端
当调度程序搜索时,我们会有一些服务器端代码发送已运行搜索的通知,并告诉客户端提取结果.
public void Update(string userId, Guid bId)
{
var context = GlobalHost.ConnectionManager.GetHubContext<LiveBatchViewHub>();
context.Clients.User(userId).performUpdate(bId);
}
Run Code Online (Sandbox Code Playgroud)
客户端(实时更新的查看者)
除非开发者工具是开放的,否则永远不会调用
liveBatchHub.client.performUpdate = function (id) {
//perform update here
update(id);
};
Run Code Online (Sandbox Code Playgroud)
编辑
一些可能有用的信息(我不确定它为什么会产生影响)但这只会在我做服务器>客户端调用时发生.当调度程序更改搜索参数时,更新是客户端>服务器>客户端或调度程序客户端>服务器>查看器客户端,这似乎有效.单击搜索后,搜索管道中的服务将调用performUpdate服务器端(server> viewer-client).不确定这是否重要?
编辑2和最终解决方案
眼睛充血,我意识到我遗漏了这个问题的一个关键部分:我们在这个页面上也使用了角度.猜猜我已经盯着它看了太久而把它留了出去 - 抱歉.我给了JDupont答案,因为他在正确的轨道上:缓存.但不是jQuery的ajax缓存,角度$ 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';
}]);
Run Code Online (Sandbox Code Playgroud)
小智 12
我过去在IE中经历过类似的行为.我可能知道你的问题的解决方案.
IE默认缓存一些ajax请求.您可能想尝试全局关闭此功能.看看这个:如何防止IE使用jQuery缓存Ajax
基本上你会像这样全局关闭它:
$.ajaxSetup({ cache: false });
Run Code Online (Sandbox Code Playgroud)
或者对于像这样的特定ajax请求:
$.ajax({
cache: false,
//other options...
});
Run Code Online (Sandbox Code Playgroud)
我的GET请求缓存有类似的问题.除非dev工具打开,否则我的更新功能只会启动一次.当它打开时,不会发生缓存.
如果您的代码与其他浏览器一起正常工作,那么问题可能来自SignalR使用的传输方法.它们可以是基于浏览器支持的WebSocket,Server Sent Events,Forever Frame和Long Polling.
该永远框架仅适用于IE浏览器.您可以看到SignalR简介以了解在各种情况下将使用哪种传输方法(请注意,您不能在每个浏览器上使用任何传输方法,例如,IE不支持服务器发送事件).
您可以通过查看QueryString对日志记录有用的请求来了解在集线器内部使用的传输方法:
Context.QueryString["transport"];
Run Code Online (Sandbox Code Playgroud)
我认为这个问题可能来自IE 使用Forever Frame,因为有时它会导致SignalR在Ajax调用时崩溃.您可以尝试删除SignalR 中的Forever Frame支持,并强制使用浏览器中剩余的支持方法,并在客户端使用以下代码:
$.connection.hub.start({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] });
Run Code Online (Sandbox Code Playgroud)
我展示了一些关于SignalR的现实,并为您提供了一些日志/跟踪工具来解决您的问题.如需更多帮助,请提供更多详细信息
更新:由于您的问题似乎很奇怪,而且我对您的代码的看法不够充分,所以我建议您根据我的经验希望有用的一些说明:
另外我认为您需要使用liveBatchHub.server.update(variable, ....);而不是liveBatchHub.server.updateParameters(variable, ....);在Dispatcher端进行服务器调用,因为您之后应该使用服务器方法名称server.
| 归档时间: |
|
| 查看次数: |
7611 次 |
| 最近记录: |