2012-11-05 16 views
5

Chciałbym być bardziej konkretny tutaj, ale niestety może to być trudne. Zasadniczo mam nadzieję, że jest to jakiś "dobrze" znany czas lub problem z konfiguracją.Witryna z uruchomionym JavaScript setInterval rozpoczyna się niepowodzeniem po ~ 1day

Mamy stronę internetową z przeglądem strony internetowej (JS/html - ASP.net) na ekranie w fabryce. Ten ekran nie ma klawiatury, więc powinien odświeżać stronę na zawsze - lata być może (chociaż 1 tydzień może być w porządku). (Jest używany przez pracowników fabryki do wyświetlania przychodzących transportów itp.)

Wszystko działa idealnie; strona stale się aktualizuje i otrzymuje nowe poprawne dane. Następnie, czasami rano na ekranie "Przegląd" nie ma danych, a pracownicy muszą ręcznie odświeżyć witrynę za pomocą prostego przycisku odświeżania lub F5 - który naprawia wszystko.

Próbowałem kilka rzeczy, próbując odtworzyć błąd się tym:

  1. cięcia połączenia internetowego i wiele innych sposobów, zarówno Timeout (wartości graniczne, zatrzymywanie usług itd.).
  2. Ustawienie czasu odświeżania setInterval na 100ms i pozwolenie stronie na uruchomienie 3-5 minut. (normalny czas to 1 minuta)
  3. setInterval POWINIEN działać na zawsze zgodnie z wyszukiwaniem w Internecie, które już zrobiłem.
  4. Sprawdź, czy "częstotliwość JavaScript" nie została wyłączona w ustawieniach oszczędzania energii.

Bez względu na wszystko; Witryna powraca do prawidłowego działania BEZ odświeżania, zaraz po ponownym podłączeniu kabla internetowego lub czegoś podobnego - nie mogę odtworzyć błędu.

Strona jest zależna od zaplecza usługi WCF i integracji projektu, ale ponieważ pracownicy naprawiają to za pomocą prostego odświeżania, zakładam, że to się nie zawiesiło.

EDYCJA: Przeglądarka, którą próbowałem odtworzyć błąd w IE/win7. Zapytam jutro o fabrykę, ale zgaduję, że IE/win? również.

Czy setInterval w rzeczywistości jest naprawdę nieskończony, czy jest tu coś jeszcze nie tak?

Cała pomoc doceniona.

AKTUALIZACJA: Przyszedłem dziś rano po opuszczeniu strony internetowej uruchomionej w trybie debugowania z punktem przerwania w klauzuli catch kodu aktualizującego witrynę. Było 2 min. Błąd limitu czasu (zajęty porządki serwer podczas prawdopodobnego nocy), a następnie zawsze po tym błąd null odniesienia w tej linii:

var showHistory = (bool)Session.Contents["ShowHistory"]; 

Naprawiłem go z odświeżaniem jak pracowników. Teraz myślę, że może to być limit czasu sesji, mimo że nadal pingujemy serwer .. Oczywiście mój limit czasu sesji mógł zostać spowodowany przez punkt przerwania, powodując zawieszenie go na zawsze przy pierwszym przekroczeniu czasu - mimo to zachowanie jest takie samo jak w fabryce. Dopilnuję, aby poinformować was o ostatecznym rozwiązaniu później.

UPDATE 2: Testowanie trwa.

AKTUALIZACJA 3: Fabryka jest IE 9, ich maszyna testowa to IE 7, a moja maszyna to IE 9. Błąd był widoczny na IE7, ale NIE mój IE9 po weekendzie. Próbowaliśmy wyłączyć pamięć podręczną ajax podczas naszego krytycznego kodu data_binding, ale nic nie zrobiliśmy. Przetestowałem pod kątem wycieków pamięci i udało mi się utworzyć przyzwoity wyciek, jeśli odświeżam 100 razy na minutę. Nie sądzę, że to był problem, ale odświeżenie wyczyściło pamięć.

Spróbujemy teraz odświeżania rzeczy.

+0

+1, ponieważ mam podobny system i chciałbym wiedzieć, czy to rzeczywiście jest problem. – chead23

+0

Jakiej przeglądarki/os/hardware ... może to być cały zestaw różnych rzeczy, aby być szczerym. – Dabloons

+0

Nie ma nieodłącznego powodu, że powinien to być problem, jeśli odświeżasz całą stronę. Jeśli kod używa ajax do załadowania nowej treści, możliwe jest, że wyciek pamięci spowoduje, że skrypt się nie powiedzie. – Pointy

Odpowiedz

3

setInterval() powinien trwać wiecznie. Ale możliwe jest, że twój skrypt/strona wycieknie jakiegoś zasobu, który ostatecznie powoduje błąd w twoim skrypcie strony lub wewnętrznie w przeglądarce.

Jeśli tak jest w rzeczywistości, najprawdopodobniej możliwe jest znalezienie źródła wycieku zasobów i naprawienie rzeczywistego problemu, ale nawet w niektórych przeglądarkach występują problemy z bardzo długimi procesami.

Prawdopodobnie warto obejrzeć wykorzystanie zasobów, aby sprawdzić, czy użycie pamięci przeglądarki rośnie wraz z uruchomieniem strony. Ale odkąd F5 to naprawia, sugerowałbym, że jako środek bezpieczeństwa, po prostu ładujesz stronę co kilka godzin. W większości nowoczesnych przeglądarek odświeżenie strony zwalnia wszystkie zasoby związane z poprzednią stroną i daje czysty plan z tego punktu widzenia.

Tylko w ten sposób (co powoduje co pół godziny):

setTimeout(function() { 
    window.location.reload(true); 
}, 6 * 1000 * 60 * 60); 

będzie nie tylko daje czysty start, ale także automatycznie powodować swoją aplikację, aby pobrać dowolny server-side zmienia mogłeś wykonane do aplikacja raz na jakiś czas, więc jeśli wydasz poprawkę, zostanie ona automatycznie wdrożona w ciągu kilku godzin.

Możesz również użyć tagu odświeżania meta na swojej stronie.

+1

@MartinClemensBloch - nie, nie jestem w BTC. Możesz zaznaczyć odpowiedź zielonym znacznikiem wyboru jako wybraną odpowiedzią. – jfriend00

+0

Tak, nie martw się, gdy potwierdzę dokładne rozwiązanie;) –

1

Zgaduję, że jesteś ukąszony przez zawracanie puli aplikacji. To zresetuje aplikację po stronie serwera i zabije wszystkie sesje (przynajmniej jeśli użyjesz sesji in-proc, która jest domyślna). Odtworzenie może się odbyć o 03:00, dlatego nie pojawia się w zwykłych sesjach debugowania, ale tylko wtedy, gdy pozostawia się go na noc.

Możesz sprawdzić istnienie sesji w ramach tego serwisu internetowego. Jeśli sesja ma wartość NULL, zwróć specjalną wartość, która wyzwala stronę (Twój odbierający kod javascript), aby wykonać pełne przeładowanie strony, która utworzy nową sesję. W ten sposób nie musisz czekać na zaplanowany limit czasu strony, aby uzupełnić stronę.

0

Jednym z niewspomnianych tu rozwiązań jest ustawienie plików cookie tak, aby miały wygaszenie poślizgu. W końcu zrobiliśmy kilka różnych rzeczy, ale jednym z problemów było upłynięcie limitu czasu uwierzytelnienia użytkownika/cookie, a następnie użytkownik został przeniesiony na ekran logowania.

Powiązane problemy