Archivo por meses: octubre 2014

Copiar una solución quitando git

Si tenemos una aplicación en visual studio que está enlazada a git y queremos copiarla en otro lugar quitando git lo que hay que hacer es tan sencillo como copiar el contenido de toda la solución salvo los ficheros de git.

¿Cuáles son los ficheros de git en una solución de visual studio?

Son los siguientes:

contenidogitsolucionvs

Si nos fijamos el directorio .git está como fichero oculto y para visualizarlo será necesario que cambies tu configuración del explorador de ficheros de windows.

Para copiar una solución quitando git lo que deberás borrar son estos ficheros una vez copiada.

Error de validación de viewstate MAC

En el supuesto de que instales tu aplicación web en una granja de servidores debes tener en cuenta que es posible que la validación del viewstate no se comporte correctamente. Como sabemos para un programador esto es un problema porque son errores que no se producen en nuestro equipo local de desarrollo sino que es en el despliegue.

El error

El error en cuestión es el siguiente:

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey>….

ViewState MAC Farm

¿Por qué este error?

Como sabemos en asp.net existe el concepto del viewstate que permite guardar el estado de ciertos controles y partes de la página para ser reutilizados después de un postback. Esto que a priori es una ventaja implica el inconveniente de que un usuario malintencionado envíe una carga _VIEWSTATE y engañe a la aplicación y realice una acción que no se debería realizar.

Para evitar este tipo de ataque el campo _VIEWSTATE se protege codificándolo con un código de autenticación de mensajes (MAC). ASP.Net valida el MAC que se envía con la  carga cuando se produce un postback, si no coincide se produce un error en la validación del viewstate.

La clave que se utiliza para calcular el MAC está en el elemento machineKey de la aplicación en el archivo web.config.

Una de las causas más comunes que provocan este error es que nuestra aplicación está en una granja de servidores, en este caso cada uno de los servidores generará una machineKey para nuestra app y entonces ninguno acordará cual aplicar.

Solución

La mejor solución y más sencilla es aplicar una machineKey explícitamente en nuestro web.config. De esta manera cualquier servidor que pretenda ejecutar nuestra aplicación utilizará de manera obligada la clave que le establezcamos en este fichero.

¿Cómo generamos nuestra clave machinekey?

Para generarlo tenemos varias maneras pero yo recomiendo nunca utilizar sitios web donde se generan automáticamente ya que no sabemos si estas claves se han generado de forma segura o son guardadas para posibles usos malintencionados, buff ya sé que suena muy rebuscado pero no nos podemos fiar, solo debemos usar las claves generadas por nosotros mismos.

En este link podemos ver varias maneras para crear el machine.config.

¿En qué sección del web.config editamos nuestra machinekey?

El elemento <machineKey> solo es válido en el archivo Web.config en la raíz de la aplicación y no es válido en el nivel de subcarpeta (location).

<configuration>
  <system.web>
    <machineKey ... />
  </system.web>
</configuration>

 

Problema con edmx al publicar en Azure

Espero que no tengas el siguiente problema con edmx al publicar en Azure.

Primero expongo la situación en la que me encontré:

Empecé a desarrollar un proyecto con Visual Studio 2013 en el que partía de una base de datos SQLServer Azure ya creada. Añadí un elemento de edmx para crearme las entidades de la base de datos así como las vistas y procedimientos almacenados.

En mi equipo local conectaba con esta base de datos y el contexto de Entity Framework también funcionaba correctamente ya que conseguí agregar el origen de datos de una tabla a mi GridView.

Pues bien, cuando terminé mi desarrollo y me decidí por publicarlo en Azure al llegar a cualquier pantalla donde necesitaba acceder a los datos me daba el siguiente error:

…SQLException Invalid Object Name «dbo.NombreTabla»…

Lo que aparentemente dice este error es que no existe la tabla en la base de datos a la cual me conectaba. Esto me parecía increíble porque ni siquiera estaba trabajando con la base de datos local sino que en el momento de la programación atacaba directamente a la base de datos en Azure y… funcionaba y seguí funcionando, con lo que la cadena de conexión debería de ser la misma.

Después de darle muchas vueltas observé que aparte de publicar mediante la opción «Web Deploy» existe la opción de publicar mediante «ftp». Decidí publicar en azure mediante ftp y finalmente conseguí que funcionara.

Aún no sé porque el método «Web Deploy» no funcionaba correctamente pero si alguien sabe o intuye por qué por favor que nos lo comente.