Sys.WebForms.PageRequestManagerParserErrorException nedir ? Nasıl Engellenir ?

Microsoft ASP.NET AJAX UpdatePanel panel kullandıysanız   “Sys.WebForms.PageRequestManagerParserErrorException”  hatasıyla karşılaşmanız olasıdır.

PageRequestManagerParserErrorException ne anlama geliyor ?

Update panel kontolü render edilecek parçasını kontrol etmek için asenkron postbackler kullanır. Bunu client üzerinde JavaScript, server üzerinde ise C# kullanarak gerçekleştirir. Asenkron postbackler normal postbacklerle tamamen aynıdır ancak önemli bir fark dışında : render edebilme. Asenkron postbackler normal sayfalardaki eventler gibi aynı yaşam döngüsü üzerinde hareket ederler. Sadece render aşamasında farklılık meydana gelir. Update paneli render ederek yakalarız ve özel bir format kullanan client içerisine göndeririz. Ek olarak, farklı bilgi parçalarıda göndeririz. Page title, hidden form değerleri, form action URL, ve script listeleri gibi.

Bahsettiğim gibi, render işlemi client üzerinde JavaScript’in anlayabileceği özel bir formatta yapılır . Şayet formatı karıştırdıysanız format bozulacaktır. Web yazılımcılarının hata ayıklamak amacıyla çok sık başvurdukları bir şey olan, Page’in Load eventinde Response.Write() çağırmak, muhtemelen en çok kullanılan yöntemdir.

Client parse işlemini yapamadığında blob verisini alma işlemi sonlanır ve PageRequestManagerParserErrorException hatasını fırlatır. Aşağıdaki bir mesaj örneğidir :


---------------------------
Microsoft Internet Explorer
---------------------------
Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.
Details: Error parsing near 'Merhaba, Dünya!106|upd'.
---------------------------
OK  
---------------------------

Bana sorarsanız bu hata tamamıyla kötü bir şey anlamına gelmiyor. Sonuçta birşeyler yaptığımız gösterir 🙂 Detaylar neden parse etme işlemininin bitirilmesine karar verildiğine dair bilgi veriyor. Response.Write() yazımdan gelen text değerini ve ondan sonra bahsettiğim özel formatın parçasını görebilirsiniz.

PageRequestManagerParserErrorException Hatasının Sebepleri 

PageRequestManagerParserErrorException hatasının meydana gelmesine sebep olan en yaygın nedenler :

  1. Response.Write() çağırmak
    Response.Write() direk çağrılarak ASP.NET kontrolleri normal render edilerek iletilir. Yazdığınız değerler ek işlem yapmaksızın doğrudan istemciye giderler (genellikle). Bu durum Update Panel’in veriyi özel formatta kodlamadığı anlamına geliyor.
  2. Response filters:;
    Response.Write() ile benzerdir, response filtreleri UpdatePanel’in anlayamayacağı bir yolla render edebilirler.
  3. HttpModules:
    Response.Write() ve response filtreleri gibi şeydir.
  4. Server izleme etkleştirildiğinde:
    Tekrar izleme uygulamasını farklı bir şekilde yapın. Response.Write() kullanılarak yazılan izleme ve UpdatePanel için kullandığımız özel format karışıklığına karşı etkilidir.
  5. Server.Transfer() çağrısı :
    Malesef çağırılan Server.Transfer()’i tespit etmenin bir yolu yok. Yani birisi Server.Transfer() çağırdığında UpdatePanel akıllı bir şey yapamaz demektir. İstemciye geri gönderilen response, transfer ettiğiniz sayfadan gelen Html işaretleyicidir. Html olduğundan ve özel formatta olmadığından dolayı, parse edilemez ve hata alırsınız.

PageRequestManagerParserErrorException Hataları Nasıl Engellenir

İlk olarak önceki listeden hiç bir şey yapmayın. Dönen hataların nasıl gidereleceği (mümkün mertebede) çözüm listesi :

  1. Response.Write() çağırmak
    Bir <asp:Label> kontrolünü veya benzer bir kontrolün Text özelliğini vererek sayfanıza yerleştirin. Önemli nokta sayfanızın geçerli bir HTML Page olması. Response.Write() kullandığınızda sayfalarınızdaki Html işaretleyicileri geçerli veya doğru bir şekilde sonlandırmalısınız.
  2. Response filtereleri:
    Response filtreleri artık çok kullanılmıyor. Filtre düzenlemek için kullanılıyor olabilir. Mümkün mertebe kontrol seviyesinde filtreleyin, response seviyesinde değil.
  3. HttpModules:
    Response filtrelerle aynıdır.
  4. Server izleme etkleştirildiğinde:
    İzleme için farklı form kullanın, log dosyasına yazılan, Windows event log veya özel bir mekanizma gibi.
  5. Server.Transfer() çağırısı :
    Neden bazı insanlar her zaman Server.Transfer() kullanır tam emin değilim. Belki klasik ASP den gelen bir alışkanlıktır. Benim tavsiyem parametreli Response.Redirect() yada cross-page gönderimidir.

Parse hatasını engellemenin diğer bir yoluda sıradan postback kullanmak yerine asenkron bir postback kullanmaktır. Örneğin, bir butonunuz var ve mutlaka Server.Transfer() yapılması gerekiyor. Bu işlemi normal bir postback ile yapın. Bunu yapmanın bir kaç yolu var :

  1. En kolay yolu bir UpdatePanelin dışına bir buton yerleştirmektir. Ama malesef sayfanız bunu yapmanıza izin vermeyecektir.
  2. UpdatePanelinize bu butonunuza işaret eden bir PostBackTrigger ekleyin. Şayet buton static olarak işaretlenmişse sorunsuz bir şekilde çalışacaktır.
  3.  ScriptManager.RegisterPostBackControl() çağırmak ve söz konusu butonu iletmek. Bu yinelenen bir template içerisinde, dinamik olarak eklenen kontroller için en iyi çözümdür.

Muavenet

Web teknolojilerine merak salmış bir bilgisayar mühendisinin yazıları

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir