Web Deploy – config Transformation

Una de las utilidades que contamos los desarrolladores web en Visual Studio 2010 y que por mi experiencia veo que no se utiliza mucho. Es la transformación de ficheros de configuración.

A quien no le ha pasado que ha realizado un despliegue al entorno de producción y se ha dejado el modo debug activado o la cadena de conexión a la de test. Pues Visual Studio nos permite poder evitar esto de una manera muy fácil y además automática, para que no nos tengamos que preocupar de si lo hemos configurado todo correctamente para el despliegue.

Ficheros de Transformación

Una de las situaciones que habitualmente nos encontramos en los proyectos, es que tenemos que tener diferentes ficheros de configuración para cada uno de los entornos de los que contamos.

No es lo mismo hacer un despliegue para el entorno de Desarrollo que para Pre-Test o Producción. Por eso ahora disponemos de la posibilidad de modificar el fichero de configuración dependiendo de donde queramos publicar nuestra aplicación web.

Lo primero que tenemos que hacer es crear una configuración de compilación que la podemos definir por ejemplo para cada entorno en el que trabajaremos con las diferentes configuraciones.

Podemos crear una configuración nueva o copiar de otra existente.

Una vez que tengamos las configuraciones creadas, hacemos clic con el botón derecho en el fichero de configuración y añadimos los nuevos ficheros de transformación.

Tendemos que tener tantos ficheros de transformación como diferentes configuraciones necesitemos en nuestros despliegues.

¿Qué son los ficheros de Transformación?

Los ficheros de transformación, son ficheros XML que utilizan los atributos XML para especificar que se tienen que modificar o eliminar del fichero web.config.

Por ejemplo el fichero de transformación de la publicación en Release elimina el famoso atributo Debug=true.

 

1 <?xml version="1.0"?>
3 <system.web>
4 <compilation xdt:Transform="RemoveAttributes(debug)" />
5 </system.web>
6 </configuration>

 

XML-Document-Transform

Este espacio de nombres tiene dos propiedades Principales:

  • Locator:Se seleccionan los elementos que coinciden con la expresión XPath combinada.
    • Locator=”Match(key)” – Selecciona los elementos que concidan con el atributo key.
  • Transform:Especifica la transformación de elemento o elementos seleccionados con la propiedad locator.
    • Replace: Sustituye el elemento o primer elemento seleccionado por el informado.
    • Insert: Inserta un nuevo elemento como podría ser una nueva cadena de conexión, al final de la colección.
    • InsertBefore: Inserta un nuevo elemento justo antes del elemento seleccionado.
    • InsertAfter: Inserta un nuevo elemento justo después del elemento seleccionado.
    • Remove: Elimina el elemento o primer elemento seleccionado.
    • RemoveAll: Elimina todos los elementos seleccionados.
    • RemoveAttributes: elimina el atributo especificado de los elementos seleccionados.
    • SetAttributes: Modifica los atributos especificados de los elementos seleccionados.

Los ejemplos más utilizados serían:

  1.  
    1. Modificar el valor de una propiedad personalizada de la configuración por su clave.

 

1 <add key="UrlEscritura" value="http://test/ Solicitudes/ServicioEscritura.svc" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>

 

  1.  
    1. Modificar una cadena de conexión por su nombre: perfecto si atacamos a diferentes bases de datos en cada entorno.

 

1 <connectionStrings>
2 <add name="SqlCon" connectionString="Data Source=server;Initial Catalog=test;" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
3 </connectionStrings>

 

  1.  
    1. Eliminar el famoso atributo de modo Debug cuando compliamos en Release:

 

1 <system.web>
2 <compilation xdt:Transform="RemoveAttributes(debug)" />
3 </system.web>

 

Conclusión

Si nos preocupamos un poco en tener diferentes configuraciones de compilación para nuestros entornos, además de facilitarnos los despliegues y su configuración de forma automática.

También nos evita los típicos errores por descuido que tantos problemas nos suelen dar en los despliegues.

Cross-Posting: http://mrubino.net 

 

 

Push con SingalR

Últimamente se está oyendo hablar mucho de SignalR en los en tornos de ASP.Net y no es para menos.

Los programadores web estamos acostumbrados a hacer peticiones al servidor “Pull” para poder consultar cualquier cosa y en más de una ocasión hemos tenido que tirar de un timer en el cliente para que cada X-tiempo consulte un recurso del servidor e ir informando al usuario del progreso de una tarea o de los datos que se tienen que actualizar constantemente.

Para evitar esto podríamos utilizar a día de hoy varias opciones como la API de html5 WebSocket que está en fase borrador y ha tenido algún problema de seguridad, podemos utilizar el servidor Openfire con el protocolo XMPP o servidor Node.js con la librería Nowjs . Pero la ventaja que proporciona SignalR frente los otros es que esta especialmente diseñado para aprovechar las características de las aplicaciones ASP.NET MVC tanto el lado del servidor como la parte cliente.

Como empezar

Para empezar tenemos que instalar la librería que tenemos disponible desde Nuget.

Tienes que tener en cuenta que tiene dependencias con la librería JQuery .

El Servidor

En el servidor solo necesitamos una clase que implemente Hub y si queremos hacer una devolución al cliente solo tenemos que añadir una expresión dinámica a Clients que se resolverá en tiempo de ejecución.

 

 
1 public class NotificationHub : Hub
2 {
3 public void Notificar(string valor)
4 {
5 Clients.AddValor("Informamos al cliente");
6 }
7 }

 

El cliente

Recordar la dependencia con JQuery y además hay que poner una referencia a “/Signalr/Hubs” que es donde se crearan los scripts dinámicamente para las llamadas al servidor.

 

 

1 <script type="text/javascript">// <![CDATA[
2 src</span>="/Scripts/jquery-1.7.1.js" type="text/javascript">
3 // ]]></script>
4 <script type="text/javascript">// <![CDATA[
5 src</span>="/Scripts/jquery.signalR.js" type="text/javascript">
6 // ]]></script>
7 <script type="text/javascript">// <![CDATA[
8 src</span>="/Signalr/Hubs" type="text/javascript">
9 // ]]></script>

 

 

1 $.connection.hub.start();
2 var hub = $.connection.notificationHub;
3 hub.AddValor = function (valor) {
4 alert(valor);
5 };

 

1. Abrimos la conexión con el servidor.
2. Inicializamos nuestro hub donde haremos las llamadas.
3. Definimos la función de devolución para actuar cuando el servidor nos informe.

Ya esta !!!! Es súper sencillo !!!!

EJEMPLO

Haré un pequeño ejemplo para que se vea toda su potencia en acción. Imaginaros un control de encuesta donde sea el servidor el que te informe que sus datos se han actualizado y solo permita votar una vez al usuario, toda la lógica estará en el servidor y no en la UI, de esta manera no mezclamos responsabilidades.
Utilizaré la librería jqplot.js para mostrar la gráfica de la encuesta en tiempo real.

Servidor

Primero crearé la parte del servidor donde estará la lógica de los votos.

  

01 public class NotificationHub : Hub
02 {
03 public void Notificar( string valor)
04 {
05 if (valor != null && Encuesta.Instance != null
06 && Encuesta.Datos.ContainsKey(valor))
07 {
08 var clientId = Context.ClientId;
09 if (Encuesta.Usuarios.Any(u => u == clientId))
10 {
11 // El usuario ya ha votado no hay que actuar
12 // ni informar de actualizaciones
13 }
14 else
15 {
16 Encuesta.Usuarios.Add(clientId);
17 Encuesta.Datos[valor]++;
18 var resultado = Encuesta.Datos.Keys.Select(
19 key => new List</pre>
20 ()
21 <pre>
22 {
23 key, Encuesta.Datos[key]
24 }).ToList();
25
26 // Informamos al cliente
27 Clients.AddValor(resultado);
28 }
29 }
30 }
31 }

 

Esta clase controla si el usuario ya ha votado y si no lo añade a la lista para no permitir votar la próxima vez que llame el mismo cliente y como se puede observar, tenemos acceso al identificador del cliente para controlar quien es el que hace la llamada, pero además podemos acceder al dentity para hacer un seguimiento más exhaustivo del usuario y sus credenciales.

Luego si el voto es de un elemento correcto le incrementa el número de votos y retorna a todos los clientes conectados los nuevos datos de la encuesta actualizada.

El cliente llamara a Notificar(valor) para informar del voto y estará en espera que el servidor actualice los datos con AddValor(resultado).

Cliente

Tendremos una vista con varios radio buttons para seleccionar las opciones de la encuesta y un botón que lanzara la llamada al servidor con la selección del usuario.

 

 

01 $(function () {
02 inicializarEncuesta();
03 $("#btnSendNotificacion").click(function () {
04 var voto = $('input:radio:checked').val();
05 hub.notificar(voto);
06 });
07 $.connection.hub.start();
08 var hub = $.connection.notificationHub;
09 hub.AddValor = function (valor) {
10 $.jqplot('chart1', [valor], chartOption()).replot();
11 };
12 });

 

Si el servidor devuelve nuevos datos “AddValor” entonces repintaremos el gráfico con la nueva información.

De esta manera todos los usuarios conectados a la encuesta reciben las actualizaciones en tiempo real.

Conclusión

SignalR es un Framework potente y fácil de utilizar que nos permite mantener conexiones abiertas con el servidor de ASP.NET.
Con este tipo de librerías podemos empezar a realizar aplicaciones realmente colaborativas y en tiempo real, donde se definen mejor las responsabilidades gracias a las llamadas Push y nos ayuda a no agregar lógica de negocios en nuestras UI.

 

Cross-Posting: http://mrubino.net