Asp.net-Mvc

IE 11 + SignalR 不工作

  • July 6, 2015

將 signalR 與 IE 11 一起使用時會發生奇怪的行為。場景:

我們有一些調度器類型的功能,調度器執行一些操作,而其他使用者可以實時查看更新(查詢)。發送的參數很好,並導致 IE 客戶端更新,而無需打開開發者控制台。

但是一種不起作用的方法(performUpdate-獲取查詢結果-這是伺服器>客戶端呼叫,而不是客戶端>伺服器>客戶端)-永遠不會被呼叫。只有在開發人員控制台打開時才會呼叫它。

這是我嘗試過的:

為什麼 JavaScript 只有在 IE 中打開開發者工具一次後才能工作?

SignalR:在 IE9 下,客戶端無法接收到消息,直到我按下 F12 !!!

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

一些程式碼片段

調度方

在下拉列表更改時,我們獲取目前選擇的值並通過網路發送更新。(這很好用)。

$('#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';
}]);

我過去在 IE 中經歷過類似的行為。我可能知道您的問題的解決方案。

IE 預設記憶體一些 ajax 請求。您可能想嘗試在全域範圍內關閉此功能。看看這個:如何防止 IE 使用 jQuery 記憶體 Ajax

基本上你會像這樣全域關閉它:

$.ajaxSetup({ cache: false });

或者對於像這樣的特定 ajax 請求:

$.ajax({
 cache: false,
 //other options...
});

我的 GET 請求記憶體也有類似的問題。除非開發工具打開,否則我的更新功能只會觸發一次。當它打開時,不會發生記憶體。

引用自:https://stackoverflow.com/questions/31251720