2009-08-24 21 views
6

Z jakiegoś powodu stan mojej aplikacji stał się gigantyczny (około 14 milionów znaków). Dodaje około 1 minuty czasu ładowania. Jeśli strona ładuje się ostatecznie (co nie jest często), serwer zawiesza się za każdym razem, gdy ktoś wysyła formularz, ponieważ "Post size exceeded allowed limits."Viewstate ukryte pole tak duże, że wszystko zawiesza się

Pojawił się nagle. Nie dodałem żadnych pól, tylko niektóre javascript na stronie.

Ludzie powiedzieli mi, abym sprawdził stan oglądania. Google powiedziało mi, żebym to zrobił:

<pages maxPageStateFieldLength="1024"> 

... więc teraz zamiast dużego ukrytego pola mam teraz około 100 bardzo dużych ukrytych pól. Nie jest to dokładnie to, czego szukałem.

Dlaczego firma .NET zrobi coś takiego? Jak mogę to naprawić?

+0

Czy istnieje możliwość wyłączenia stanu widoku dla kilku elementów sterujących? –

+2

Trudno powiedzieć bez patrzenia na stronę, ale spróbuj dekodera widoku, aby zobaczyć, co jest osadzone w okienku wyświetlania. Powinieneś także wyłączyć stan wyświetlania siatek/tabel, jeśli ich nie potrzebujesz, a być może zaimplementować skompresowany stan widoku, a także włączyć gzip w IIS. –

+0

Kontrolki są polami wejściowymi i nie ma sposobu, aby wyłączyć stan ich wyświetlania, a nawet gdyby to wymagało ponownego napisania dużej ilości kodu. Jest też 10 pól, nie powinno być tak źle ... prawda? – marcgg

Odpowiedz

7

Sugerowałbym użyciu narzędzie do dekodowania swój stan wyświetlania, dzięki czemu można zorientować się, co faktycznie jest w nim (ponieważ mają oczywiście wiele informacji tam nie wydaje się potrzebne.)

A viewstate decoder pozwoli ci zobaczyć, co jest w twoim stanie, którego się nie spodziewasz. Następnie możesz zmodyfikować swój kod, usunąć kontrolkę powodującą obrażenia lub selektywnie wyłączyć stan wyświetlania (używając atrybutu EnableViewState="false") dla formantów, które nie powinny mieć go włączonego.

+0

Dzięki, wygląda całkiem fajnie, przetestuję to teraz – marcgg

+0

To denerwujące, oprogramowanie się zawiesza, najwyraźniej ciąg jest zbyt duży. Ale teraz wiem, że mój stan widzialny ma 13 428 604 znaków długości :) – marcgg

+0

W końcu działa bez awarii 5. mojej próby :) Wygląda na to, że umieszczam całą moją stronę w widoku ... jest to dość dziwne. Spróbuję zobaczyć, jaka jest tutaj logika i wrócić do SO – marcgg

3

Należy pamiętać, że kontrole zachowają swoje wartości w post-backach bez trybu wyświetlania. Często można wyłączyć stan wyświetlania dla wielu kontrolek bez żadnych problemów. Aby wyłączyć stan wyświetlania dla określonego zestawu sterowania:

EnableViewState="false" 

Jeśli ustawisz dla wszystkich sieci i jakiejkolwiek kontroli, które nie potrzebują viewsate za to znacznie zmniejszyć rozmiar.

+0

Zrobiłem to i nic nie zmieniłem. Włączyłem.Pliki ascx takie jak to: i jest tam sporo JS. Czy to może być połączone? Wyłączyłem stan wyświetlania dla nich i go nie naprawiłem – marcgg

+0

Zorientowałem to (zobacz zaakceptowaną odpowiedź)! Zaakceptowałem beska, ponieważ to odpowiedź pomogła mi rozwiązać problem, ale twoja była też pomocna ... więc +1 i bardzo dziękuję :)! – marcgg