IE 11 + SignalR无法正常工作

Jac*_*ack 21 iis asp.net-mvc internet-explorer signalr

在IE 11中使用signalR时会发生奇怪的行为.场景:

我们有一些调度程序类型的功能,其中调度程序执行某些操作,而另一个用户可以实时查看更新(查询).发送的参数很好,可以在IE客户端进行更新,而无需打开开发人员控制台.

但是一个不起作用的方法(performUpdate- 获取查询结果 - 这是服务器>客户端调用,而不是客户端>服务器>客户端) - 永远不会被调用.当开发者控制台打开时,它只会得到打电话.

这是我尝试过的:

为什么JavaScript只在IE中打开开发人员工具一次后才有效?

SignalR:在IE9下,客户端无法接收消息,直到我点击F12 !!!!

SignalR客户端在AngularJs控制器中不起作用

一些代码片段

调度员方面

在下拉列表更改时,我们获取当前选定的值并通过网络发送更新.(这很好).

$('#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工具打开,否则我的更新功能只会启动一次.当它打开时,不会发生缓存.


Ami*_*rzi 9

如果您的代码与其他浏览器一起正常工作,那么问题可能来自SignalR使用的传输方法.它们可以是基于浏览器支持的WebSocket,Server Sent Events,Forever FrameLong 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的现实,并为您提供了一些日志/跟踪工具来解决您的问题.如需更多帮助,请提供更多详细信息

更新:由于您的问题似乎很奇怪,而且我对您的代码的看法不够充分,所以我建议您根据我的经验希望有用的一些说明:

  1. 适用于IDE中的Setup Browser Link
  2. 在其过程中检出网络选项卡请求/响应数据
  3. 确保您没有在服务器/客户端使用保留名称(可能通过重命名方法和变量)

另外我认为您需要使用liveBatchHub.server.update(variable, ....);而不是liveBatchHub.server.updateParameters(variable, ....);Dispatcher端进行服务器调用,因为您之后应该使用服务器方法名称server.