Actualizar versión del SDK de Windows Azure para .NET en proyecto CloudService

Si trabajás con Windows Azure seguramente ya estás acostumbrado a tener que actualizar SDK’s, herramientas y librerías para mantenerte actualizado con las últimas novedades. Y realmente, después de varias actualizaciones el asunto puede volverse bastante «sucio». Yo actualmente tengo instaladas 3 versiones distintas del SDK de Windows Azure para .NET:

upgrade-cs-4

Recientemente, tuve que realizar unas modificaciones en una aplicación que contenía un proyecto de tipo CloudService. Después de haber hecho los cambios, ejecuté el CloudService para hacer el Debug y me saltó el siguiente mensaje de error:

upgrade-cs-2

El enorme grado de detalle del mensaje de error me forzó a tener que abrir la ventana de Output para tratar de entender cual era realmente el problema y por suerte ahí encontré un poco mas de información:

Windows Azure Tools: Error: The installed Windows Azure Emulator does not support the role binaries. Please install the latest Windows Azure Emulator and try again.
Windows Azure Tools: Warning: The role binaries in your package are using an older version of the Windows Azure SDK. Please consider upgrading.
Windows Azure Tools: The system is missing a prerequisite to execute the service. Please see the release notes.

En ese momento me di cuenta de cual era el problema: instalé una nueva versión del SDK de Windows Azure y el proyecto que estaba intentando abrir había sido creado usando una versión anterior. Excelente! Pero… ¿cómo lo corrijo?

Me acordaba que en ocasiones anteriores me había pasado algo similar: había intentado abrir una solución que contenía un CloudService y me apareció un mensaje de advertencia indicándome que no tenía instalado el SDK de Windows Azure y me había dado las opciones de bajarlo o de cambiar la versión del SDK del proyecto. Por suerte pude conseguir una captura del mensaje:

upgrade-cs-1

Aquella vez tuve suerte y seleccionando la opción para bajar el SDK, solucioné el problema al instante. Pero ahora, la historia es diferente, ya no es una advertencia al abrir la solución sino que es un mensaje de error al intentar hacer el Debug del proyecto, y sin ninguna ayuda de como arreglarlo… ¿Por qué esta vez es diferente?

Resulta ser que la diferencia está en que ésta vez, la versión del SDK que utiliza el CloudService sí está instalada, pero existe una versión más actualizada instalada, y al parecer la nueva versión reemplazó «algo» de la versión anterior dejándola inutilizable.

Afortunadamente, la manera de solucionar este problema resultó ser bastante simple:

  1. Abrir normalmente la solución que contiene el/los proyecto/s de tipo CloudService.
  2. Clic derecho en el/los proyecto/s de tipo CloudService y seleccionar la opción Properties.
  3. Clic en la pestaña Application. Allí debería de aparecer un mensaje como el de la imagen que muestro debajo.
  4. Clic en el botón «Upgrade…». El VS realizará una actualización del proyecto (en algunos casos aparecerá un Wizard para realizar la actualización, preguntando si se desea hacer un backup, etc).
  5. Listo!

upgrade-cs-3

Después de la actualización, el mensaje que aparecía en la pestaña Application debería haber desaparecido y debería aparecer simplemente el nombre de la versión del SDK de Windows Azure. Y obviamente, el proyecto debería compilarse y ejecutarse sin ningún error.

NOTA: Igualmente, recomiendo verificar que la actualización no haya roto nada en nuestro proyecto y/o solución.

Espero que les haya sido de utilidad. Se agradece mucho compartir/comentar o regalarme un café :)!

Mantener la posición luego de PostBack en una página ASP.NET WebForms

En ocasiones hacemos páginas en las cuales hay tanto contenido que quien las visita se ve obligado a moverse verticalmente usando el scroll para poder visualizar todo. Esto es completamente normal y aceptable cuando se trata de algún artículo o texto de lectura, pero cuando se trata de alguna página de ingreso de datos o que necesita algún tipo de interacción con el usuario, ese tipo de navegación no es muy «amigable».

Cuando creamos páginas de este tipo en una aplicación ASP.NET WebForms, tenemos que tener en cuenta que cada vez que el usuario haga clic en algun botón o interactúe con algún otro control que dispare un evento, la página realizará un PostBack. El problema en estos casos, es que si el usuario se encontraba en la parte inferior del contenido de la página, habiendo hecho scroll hacia abajo, luego del PostBack la página volverá a la posición superior. Claramente, es una experiencia muy disruptiva y en algunos casos incluso hará que el usuario no entienda lo que pasó.

Podríamos tener por ejemplo la siguiente página:

mantener-posicion-1
mantener-posicion-2
mantener-posicion-3

Afortunadamente, existe una manera de evitar este comportamiento. Básicamente, lo que hacemos es indicarle a las páginas que luego de realizar un PostBack deben volver a la posición en la cual se encontraban anteriormente. Y existen diferentes maneras de hacerlo.

Para toda la aplicación

Si queremos establecer este comportamiento para todas las páginas de nuestra aplicación, debemos agregar la siguiente línea en el archivo web.config:

<configuration>
	...
	<system.web>
		...
		<pages maintainScrollPositionOnPostBack="true">
		...
	</system.web>
	...
</configuration>
</pages>

Aunque suene tentador activar este comportamiento de esta manera en todas nuestras aplicaciones web, por razones de simplicidad, tenemos que entender sus implicaciones. Esta funcionalidad utiliza un par de campos hidden para guardar las coordenadas de la posición y realiza una serie de operaciones mediante JavaScript SIEMPRE antes y luego de cada PostBack, en el primer caso para obtener los valores de posición actual y guardarlos en los campos, y en el segundo caso para leer la posición de los campos y mover la página hasta dicha posición.

Para una única página

Tenemos dos maneras de activar este comportamiento en una página. La primera es estableciendo una propiedad en la directiva de la página (ASPX):

<%@ Page ... MaintainScrollPositionOnPostback="true" %>

Y la segunda es en el Code-Behind, estableciendo la propiedad MaintainScrollPositionOnPostback de la página en el método Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
	...
	MaintainScrollPositionOnPostBack = true;
	...
}

Espero que les haya sido de utilidad. Se agradece mucho compartir/comentar o regalarme un café :)!