Wczoraj dostałem info od znajomego, dla którego piszę aplikację, iż na dwóch stronach wyświetla mu się taki o to błąd:

Wiadomość: Sys.WebForms.PageRequestManagerParserErrorException: Nie można przeanalizować komunikatu odebranego z serwera. Typowe przyczyny tego błędu to modyfikacja odpowiedzi przez wywołania metody Response.Write(), filtry odpowiedzi, elementy HttpModule lub włączenie śladu serwera. Szczegóły: Błąd podczas analizowania w pobliżu elementu “<HTML dir=”ltr”><H”.

Wiersz: 6
Znak: 62099
Kod: 0
Identyfikator URI: url

Po pierwsze zauważyłem, że kod błędu jest 0 a to oznacza, że błędu nie było :) miałem więc już przeczucie, że to coś zajmie mi czas… ale do rzeczy.

Otworzyłem wirtualkę z środowiskiem dev, na którym tworzę ten projekt i próbuje problem z reprodukować. Moja maszynka to: Win2k3 ENG SP2, IIS 6.0, IE 7, WSS 3.0 ENG SP1 oraz wszystkie aktualizacje .NET. Mimo usilnych prób u mnie wszystkie działało poprawnie. Na wszelki wypadek wgrałem jeszcze ten sam kod, na którym testowałem na serwer znajomego i sprawdzam u niego. Niestety, błąd wciąż istniał. Dla informacji, jego sprzęt to Win2k8 PL, IIS 7, IE 7, WSS 3.0 PL SP1 z angielskim pakietem językowym.

Teraz już byłem pewny, że z nocki nici. Zabrałem się za przeszukiwanie netu, by znaleźć rozwiązanie problemu. Google, zwrócił naprawdę duuuużo wyników, więc zawęziłem je do kodu 0 i pozostało jedynie 224 strony. Ogólnie rzecz biorąc ludzie piszą o następujących przypadkach kiedy taki błąd może wystąpić – polecę po łepkach, nie będę się wgryzał w temat, zresztą nie czuje się na tyle silnie merytorycznie by poruszyć ten temat:

  1. Zapora sieci blokuje nagłówki stron – rozwiązaniem jest wyłączenie jej lub wyłączenie analizy nagłówków. To się tyczy głównie produktów firm trzecich (innych niż MS), choć nie wchodziłem w szczegóły, u mnie zapory nie było;
  2. Wywołuje się Response.Write() – rozwiązaniem jest zastosowanie <asp:Label/>, mnie to nie dotyczyło, gdyż Response.Write() nie wywoływałem;
  3. Filtry odpowiedzi – taki sam problem jak przy Response.Write(), z tą różnicą iż przeważnie ludzie piszą by ich po prostu nie używać, tak jak poprzednio mnie to nie dotyczyło;
  4. Przez HttpModule – tak jak filtry i write, najlepiej pozbyć się go, znów mnie to nie dotyczyło :)
  5. Ślad serwera – ogólnie robi to co Response.Write() i do tego w formacje takim samym jak UpdatePanel, należy go wyłączyć. Znów, mnie to nie dotyczyło;
  6. Server.Transfer() – zaległość ze starego ASP (możliwe), ogólnie zaleca się stosować Response.Redirect(). Mnie to nie dotyczyło;

Jak już sprawdziłem wszystkie powyższe problemy oraz sposób ich rozwiązania, zacząłem szukać głębiej. Doszedłem już do tego, że na stronie na której błąd występuje u znajomego a u mnie nie, dodałem takie oto atrybuty do dyrektywy Page:

ValidateRequest="false" 
EnableEventValidation="false"

To też nie pomogło. Zorientowałem się także, że od rozpoczęcia pracy minęło 6h i jest już 2 w nocy. Jeżeli chciałem się wyspać to musiałem coś wymyślić.

Dla jednej strony moim rozwiązaniem było dodanie takiego oto skryptu javascript:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args)
{
	args.set_errorHandled(true);
}

Po prostu przechwytywałem wszystkie statusy (czy to 200 czy też inne) i ustawiałem jako obsłużone. To pomogło na jeden stronie. Jak ręką odjął u znajomego kod poszedł bez przeszkód. Zaś wciąż pozostała druga strona. Tam już nic nie pomogło. Skończyło się tym, że o 4 nad ranem skończyłem modyfikować logikę aplikacji, by zaczęła dobrze działać. Rozwiązaniem u mnie, było przerzucenie kilku akcji na stronę pośrednią. Na stronie na której błąd występował, zrezygnowałem z jakich kol wiek operacji na elemencie listy SharePoint, i to poszło. Zadziałało bez błędu.

W moim przypadku IMO cały problem był winą IIS 7.0, lub czegoś w systemie Win2k8 – ale mogę się mylić, bo po prostu nie znalazłem niczego co by było nie poprawnie u mnie w kodzie. Także przeświadczenie o tym, iż działa to na IIS 6.0 i Win2k3 mówiło mi, iż to może być tego wina. Więc rozwiązanie takie jakie zastosowałem uważam za fair. U was może być inaczej :)

Ogólnie rzecz biorąc, jeżeli natraficie na taki błąd to od razu spróbujcie go rozwiązać za pomocą powyższego JS, jeżeli nie pomoże należy szukać dalej. Jeżeli pomoże to kłopot z głowy. Chyba, że macie czas i chcecie poznać przyczynę – a jest ich parę, jak nie paręnaście. W każdym bądź razie, jeżeli natraficie na inne rozwiązanie problemu niż moje, to dajcie proszę znać. Taką wiedzę warto mieć w jednym miejscu. Dzięki. A tym czasem wracam do pracki :)

1 KOMENTARZ

Comments are closed.