Gerardo Contijoch

Experiencias del día a día trabajando con .NET – ASP.NET, C#, ASP.NET MVC y demas…

Posts Tagged ‘postback’

Sys.WebForms.PageRequestManagerParserErrorException al hacer un postback parcial

Posted by Gerardo Contijoch en diciembre 26, 2008

Hace unos días me encontré con otro problema bastante molesto en ASP.NET AJAX al cual no le encontré solución. Se presenta cuando se hace un postback parcial y se muestra un error como el siguiente:

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 ‘<!DOCTYPE html P’.

(Noten que el nodo <!DOCTYPE> parece estar truncado en la respuesta)

Luego de buscar un rato, me encontré con este post de Eilon Lipton (¡el creador de este error!) donde explica porque sucede y como se puede evitar.

Cuando uno hace un postback parcial la respuesta viene en un formato especial el cual es interpretado por los scripts del lado del cliente de ASP.NET AJAX. Si nosotros durante el procesamiento del postback modificamos la respuesta, entonces los scripts van a ser incapaces de procesarla, produciendo este mensaje de error.

Para evitarlo hay que tener presente los siguientes puntos:

Nunca ejecutar Response.Write(“…”); durante un postback asincrónico.

Esto se debe a que al escribir directamente sobre la respuesta, estamos modificándola sin que los objetos encargados de procesarla lo sepan y por lo tanto, no pueden prever esos cambios.

Uso de filtros de las respuestas y HttpModules.

Al igual que con el punto anterior, si modificamos la respuesta de alguna manera, vamos a estar provocando este error seguro.

No habilitar el Trace.

Cuando uno habilita el trace en las paginas, básicamente lo que se esta haciendo es una serie de Response.Write(“…”); con la información de tracing.

Llamadas a Server.Transfer();

Cuando uno ejecuta Server.Transfer(), la respuesta deja de ser la respuesta que espera el objeto que provoca el postback asincrónico y pasa a ser el HTML generado por la página a la cual hicimos el transfer. Obviamente, esto va a interferir con el procesamiento de la respuesta (¡ya que la esta sería una pagina completa totalmente diferente a la respuesta esperada!).

En mi caso particular, no estaba haciendo nada de lo mencionado arriba, sino que estaba agregando una cookie a la respuesta, lo cual evidentemente la modifica, así que podemos agregar a la lista:

No agregar cookies a la respuesta de un postback asincrónico.

Al agregar las cookies a la respuesta, la estamos modificando (ya que enviamos la información de la cookie), por lo que hay que evitar hacerlo.

Entonces, ¿cómo se soluciona el problema cuando no podemos dejar de usar cookies o HttpModules? La solución que encontré yo fue muy simple: reescribí la página en cuestión y saque todo lo referente a ASP.NET AJAX. Todo funcionó de maravillas con un postback clásico.

¡Nos vemos en el próximo post!

PD: Si realmente necesitan modificar la respuesta en una llamada parcial, este post puede serles utiles, yo no lo probe, pero parece que funciona…

Publicado originalmente en https://gerardocontijoch.wordpress.com.

Anuncios

Posted in ASP.NET, Desarrollo Web | Etiquetado: , , | 3 Comments »