Archivo de la categoría: Diseño y Programación Web

Temas relacionados con el diseño y la programación Web en todos los lenguajes: html, php, asp.net, javascript, jquery…

Copiar y restaurar bases de datos MySQL con codificación de caracteres intacta

Si quieres preservar caracteres como ñ, ó, ç u otros del estilo cuando migras una base de datos MySQL deberás usar mysqldump con las siguientes opciones:

mysqldump -u <tu_usario> -p <tu_password> –default-character-set latin1 –skip- character-set <tu_db> archivo.sql

Para restaurarla:

mysql -u <tu_usuario> -p <tu_password> –default-character-set latin1 <tu_db> < archivo.sql 

Esto solucionará problemas al restaurar copias de seguridad mediante código. En mi código .Net realizaba un proceso que creaba tanto la copia de seguridad en scripts .sql y también tenía otro proceso que realizaba la copia de seguridad a partir del fichero generado anteriormente. Sin embargo si el comando lo ejecutaba a través de la consola de windows el proceso lo realizaba correctamente.

Aparentemente el primer proceso generaba correctamente el archivo sql pero a la hora de ejecutar el proceso no podía continuar cuando encontraba un caracter especial, (en mi caso la ñ).

Si realizas copias programadas también deberás tenerlo en cuenta sobre todo si ejecutas la restauración mediante alguna aplicación .net. Y sobre todo leer el fichero de esta manera:

StreamReader reader = new StreamReader(file,Encoding.GetEncoding(«latin1»));

Como ves los ingleses lo tienen más fácil porque nunca le ocurrirán problemas de este tipo a no ser que trabajen con aplicaciones multiidioma. Pero en cualquier caso deberías tener siempre en cuenta copiar y restaurar bases de datos MySQL con codificación adecuada.

 

Code First – Resetear Entity Framework Migrations

Si trabajas con Code First, Entity Framework y Migrations es posible que a medida que avanzas en el proyecto llegues a un estado inconsistente de la base de datos cuando intentas actualizarla con el comando update-database.

Lo ideal es solucionarlo con las opciones que te puede ofrecer codefirst, pero si aún así llegas a un punto que creas necesario resetear las migraciones lo que deberás hacer es lo siguiente:

1. – Borrar el directorio Migrations de tu proyecto.
2. – Borrar la tabla _MigrationsHistory de tu base de datos.
3. – Ejecutar el siguiente comando en la consola de administración de paquetes.

Enable-Migrations -EnableAutomaticMigrations -Force

4. – Finalmente ejecutar:

Add-Migration Initial

Todo este proceso hace que se cree un nuevo archivo Initial.cs en la carpeta de Migrations. En él podrás ver (como siempre que realizas una migración) los métodos Up() y Down() que permiten la aplicación de la migración o el regreso al estado anterior.

En este punto antes de utilizar el comando update-database deberás tener en cuenta si quieres borrar la base de datos y partir con la base de datos vacía o aprovechar los datos que ya tenías previamente.

A) Si deseas partir con una base de datos vacía será tan sencillo como borrar todas las tablas de la base de datos y ejecutar update-database.
B) Si quieres aprovechar los datos deberás profundizar en el método Up() de la migración creada y ver que tablas quieres que se regeneren. Previamente a ejecutar update-database deberás borrar las tablas que te interesan resetear en tu base de datos y comentar las líneas de código que crean las tablas que deseas conservar en el método Up(). Una vez realizadas estas dos comprobaciones podrás utilizar el comando update-database.

Espero que este artículo te haya servido de ayuda para Resetear Entity Framework Migrations.

Optimizar cache en IIS

En este post aprenderemos a optimizar cache en IIS editando el web.config.

Si tu servidor de alojamiento web es IIS puedes mejorar la velocidad de tu sitio estableciendo el tiempo de la caché insertando dentro de <system.webServer> del archivo web.config de la raíz de tu aplicación web:

<staticContent>
<clientCache cacheControlMode=»UseMaxAge» cacheControlMaxAge=»7.00:00:00″ />
</staticContent>

Donde cacheControlMode puede tomar los valores:

  • «NoControl»: no se establece un tipo de caché para el sitio, con lo que tomará los valores globales de configuración heredados.
  • «DisableCache»: caché deshabilitada para el sitio.
  • UseMaxAge: se especifica una edad de expiración de la caché en el parámetro cacheControlMaxAge en días, horas, minutos y segundos (d.hh:mm:ss)
  • UserExpires: indica la fecha exacta de expiración de la caché.

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.

 

 

Cómo localizar identity de asp net

En esta entrada haremos una pequeña explicación de cómo localizar identity de asp net.

Cuando utilizamos esta nueva característica de asp.net nos daremos cuenta que los mensajes de error propios de la validación tanto de la entidad como de negocio aparecen siempre en inglés.

La solución más sencilla para poder utilizar otras traducciones de identity será la instalación de un paquete a través de la consola de administración de paquetes con el siguiente comando:

install-package Microsoft.AspNet.Identity.Core.xx

Las últimas letras indican el idioma que queramos instalar, por ejemplo para español sería es.

install-package Microsoft.AspNet.Identity.Core.es

Una vez instalado los errores aparecerán (en este caso concreto) en castellano.

Envío de Mails con ELMAH

El envío de mails con ELMAH es una de las muchas virtudes que tiene este sistema de control de errores. En este post intentaré explicar cómo se configura.

Nota: partiremos de una instalación correcta de ELMAH. Si no sabes instalar y configurar ELMAH te recomiendo este post.

Paso 1: configurar una cuenta de correo en el web.config.

En realidad este paso no es propio de ELMAH, en el web.config se puede establecer muchos parámetros que puedes o no utilizar cuando desarrolles tus aplicaciones o software.

Para añadir una cuenta de correo deberemos abrir una sección llamada <system.net> dentro de la raíz <configuration> del web.config.

Como una imagen vale más que mil palabras aquí está la configuración completa:

Envio de mails con ELMAH

Como vemos establecemos el servidor  smtp, el puerto, el nombre de usuario y la contraseña de la cuenta.

Paso 2. Indicar a ELMAH datos del envío de correo.

El segundo paso sí que tiene lugar en la sección propia de ELMAH dentro del web.config. De nuevo podemos en una imagen como configurarlo:

Configurar envio mail con elmah

En la imagen vemos que estableceremos el campo «from» (dirección remitente del correo), el campo «to» (destinatario) y el asunto «subject».

Si nos fijamos el asunto tiene el código {0} que indica que en esa posición se sustituirá el mensaje del error de tal modo que el destinatario podrá ver de una manera rápida en que consiste el problema.

Modificar url de acceso elmah axd

Por seguridad es mejor cambiar la url donde se accederá a los errores de aplicación de ELMAH. Como sabemos en el momento de la instalación la url de acceso es la siguiente:

http://»misitio.com»/elmah.axd

Si queremos cualquier otra como por ejemplo:

http://»misitio.com»/mis_errores.axd

Deberemos reemplazar en el web.config todas las ocurrencias que encontremos de «elmah.axd» por «mis_errores.axd»

Acceso remoto en ELMAH

El acceso remoto en ELMAH por defecto está desactivado.

Esto quiere decir que solo podremos acceder a nuestra pantalla de monitorización si accedemos desde la misma IP donde está el hosting de nuestra aplicación.

Dependiendo si queremos acceder únicamente desde nuestro equipo servidor o desde cualquier equipo tenemos la posibilidad de configurarlo a través del web.config.

Dentro de la sección de configuración <elmah> existe una etiqueta <security> donde su propiedad «allowremoteaccess» nos permitirá activar o desactivar el acceso remoto.

acceso remoto elmah