2015-07-06 14 views
19

Dziwne zachowanie się dzieje podczas korzystania z IE 11. signalR scenariusz:IE 11 + SignalR nie działa

mamy niektóre funkcje typu dyspozytora gdzie dyspozytor ma pewne działania, a drugi użytkownik może zobaczyć aktualizacje żyć (zapytań) . Parametry, które są wysyłane, przychodzą dobrze i powodują aktualizacje po stronie klienta IE bez konieczności otwierania konsoli programisty.

ALE jedna metoda, która nie działa (performUpdate - aby uzyskać wyniki zapytania - jest to serwer> połączenie klienta, a nie klient> serwer> klient) - nigdy nie jest wywoływana. TO TYLKO POJAWIA SIĘ, GDY KONSOLA DEWELOPERA JEST OTWARTY.

Oto co próbowałem:

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

Niektóre fragmenty kodu

Dyspozytor strona

Po zmianie rzutu otrzymujemy aktualnie wybrane wartości i wysyłamy aktualizacje przez przewód. (To działa dobrze).

$('#Selector').on('change', function(){ 
    var variable = $('#SomeField').val(); 
    ... 
    liveBatchHub.server.updateParameters(variable, ....); 
}); 

Server Side

Kiedy dyspozytor wyszukiwania, mamy trochę kodu po stronie serwera, który wysyła informację, że wyszukiwanie zostało Ran i powiedzieć klientowi wyciągnąć rezultaty.

public void Update(string userId, Guid bId) 
     { 
      var context = GlobalHost.ConnectionManager.GetHubContext<LiveBatchViewHub>(); 
      context.Clients.User(userId).performUpdate(bId); 
     } 

po stronie klienta (przeglądarka z bieżących aktualizacji)

To nigdy nie jest wywoływana chyba narzędzi programistycznych jest otwarty

liveBatchHub.client.performUpdate = function (id) { 
        //perform update here 
        update(id); 
       }; 

Edit

Trochę więcej informacji, które mogłyby bądź użyteczny (nie jestem pewien, dlaczego to robi różnicę), ale wydaje się to TYLKO JEDYNIE się zdarza, gdy wykonuję połączenia z serwerem> klienta. Gdy dyspozytor zmienia parametry wyszukiwania, aktualizacja to klient> serwer> klient lub klient-rozsyłający> serwer> przeglądarka-klient, który wydaje się działać. Po kliknięciu wyszukiwania usługa w potoku wyszukiwania wywołuje stronę serwera performUpdate (serwer> przeglądarka-klient). Nie jesteś pewien, czy to ma znaczenie?

Edycja 2 & ostateczne rozwiązanie

Oczy przekrwione, zdaję sobie sprawę, wyszedłem na zewnątrz jedną kluczową rolę na to pytanie: używamy kanciasty jak również na tej stronie. Chyba za długo wpatrywałem się w to i zostawiłem to - przepraszam. Nagrodziłem JDupontowi odpowiedź, ponieważ był na dobrej drodze: buforowanie. Ale nie buforowanie ajax jQuery, angulars $ http.

Po prostu nikt nie musi spędzać dni/nocy waląc głowami o biurko, ostatecznym rozwiązaniem było wyłączenie buforowania wywołań ajaxowych za pomocą angularów $ http.

Zrobione z 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'; 
}]); 
+0

czy pojawia się błąd konsoli? –

+0

Brak komunikatów o błędach konsoli – Jack

+0

Czy Twoja aplikacja odwołuje się do JSON2? Jeśli tak, to czy odniesienie zostało wykonane PRZED odniesieniem do signalR.min.js? –

Odpowiedz

8

doświadczyłem podobnego zachowania w IE w przeszłości. Mogę znać rozwiązanie twojego problemu.

IE buforuje niektóre żądania ajax domyślnie. Możesz spróbować wyłączyć to globalnie. Sprawdź to: How to prevent IE from caching Ajax with jQuery

Zasadniczo byś globalnie włączyć tę opcję tak:

$.ajaxSetup({ cache: false }); 

lub dla konkretnego żądania ajax jak ten:

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

Miałem podobny problem z moim GET żąda buforowania. Moja funkcja aktualizacji uruchomiłaby się tylko raz, chyba że narzędzia programistyczne były otwarte. Gdy był otwarty, nie wystąpiłoby buforowanie.

+1

Jeśli problem rzeczywiście dotyczy buforowania, domyślam się, że pierwsze połączenie powinno działać poprawnie. –

8

Jeśli twój kod działa poprawnie z innymi przeglądarkami, więc problem może wynikać z metody transportu używanej przez SignalR. Mogą być websocket, serwer wysłał Wydarzenia, Zawsze Rama i Długi Polling oparty na wsparciu przeglądarki.

Na zawsze ramka jest tylko dla przeglądarki Internet Explorer. Możesz zobaczyć Introduction to SignalR, aby wiedzieć, która metoda transportu będzie używana w różnych przypadkach (Pamiętaj, że nie możesz ich używać w każdej przeglądarce, na przykład IE doesn't support Server Sent Events).

Można zrozumieć metodę transportu użyty Wewnątrz Hub patrząc tylko na żądanie użytkownika QueryString które mogą być przydatne do logowania:

Context.QueryString["transport"]; 

Myślę, że problem wynika z użyciem Zawsze Rama przez IE prawdopodobne , ponieważ czasami powoduje, że SignalR ulega awarii podczas wywołań Ajax. Można spróbować usunąć Zawsze Rama wsparcie w SignalR i zmusić do korzystania z pozostałych obsługiwanych metod przez przeglądarkę z następującego kodu w stronie klienta:

$.connection.hub.start({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] }); 

I wykazała pewne realia około SignalR i dał ci rejestrowanie/narzędzia śledzenia, aby rozwiązać problem.Aby uzyskać więcej pomocy, wprowadzone dodatkowe szczegóły :)

Aktualizacja: Ponieważ problem wydaje się być bardzo dziwne i nie mam wystarczająco dużo wizję całego kodu, więc proponuję Ci kilka wskazówek na podstawie mojego doświadczenia chcą być przydatne:

  1. Przeglądarka link w konfiguracji IDE odpowiednim
  2. kasie zakładka dane żądanie/odpowiedź sieci podczas procesu jego
  3. Upewnij się, że nie zostały wykorzystane zastrzeżone nazwy w twojej stronie serwera/klienta (być może przez ren Aming metody i zmienne)

Także myślę, że trzeba użyć liveBatchHub.server.update(variable, ....); zamiast liveBatchHub.server.updateParameters(variable, ....); w dyspozytora stronie dokonać połączenia z serwerem, ponieważ należy użyć nazwy metody serwera po server.

+0

Dzięki - to było jedno z pierwszych rozwiązań, które wypróbowałem. – Jack

+0

@Jack Dodałem aktualizację do mojej odpowiedzi. –