miércoles, 8 de octubre de 2014

Resolviendo: ‘An exception occurred in publishing: No such interface supported (Exception from HRESULT: 0×80004002 (E_NOINTERFACE)’

Así que estoy utilizando Visual Studio 2010 RC (también lo vi rompiendo mi paciencia en Visual Studio 2012) y es un placer usarlo como una forma sencilla de publicar mis proyectos a diferentes ambientes. Sin embargo, un problema surgió hoy después de instalar algunas actualizaciones de herramientas web:

"Se produjo una excepción en la publicación: No se admite esa interfaz (Excepción de HRESULT: 0×80004002 (E_NOINTERFACE)"

Ni siquiera podía abrir la configuración de publicación de diálogo para ver si algo estaba mal en ese país. Traté de reiniciar Visual Studio, luego ejecutarlo como administrador, no hay cambio. Al final encontré los siguientes pasos en un foro que se resolvió el problema para mí:
  • Ejecuté el símbolo del sistema como administrador
  • regsvr32 actxprxy.dll
  • Reinicie Visual Studio
Y ¡listo, mi proyecto estaba trabajando otra vez!

Espero que esto sea de utilidad para alguien más por ahí golpeando su cabeza contra una pared de ladrillos tratando la forma de resolverlo.

jueves, 25 de septiembre de 2014

Crear archivos descargables en CVS con PHP

CSV (valores separados por comas) es el formato más ampliamente soportado para la transferencia de datos tabulares entre aplicaciones. La capacidad de exportar datos en formato CSV es una característica útil para muchos programas, y se está convirtiendo cada vez más común en las aplicaciones web. Esta vez explicaré cómo usar PHP para crear archivos CSV, y cómo asegurarse de que el navegador del visitante ofrece para descargar el archivo en lugar de mostrarla.

1. El código


En el siguiente código se supone que los datos que se exportan provienen de una base de datos MySQL, pero puede ser fácilmente modificado para que funcione con otras fuentes de datos, y por lo tanto sirve como un modelo general:

// Encabezados que determinan la descarga del archivo y el nombre del archivo
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=datos_descargados.csv');

// Un punto para referir la descarga
$output = fopen('php://output', 'w');

// Los encabezados del archivo
fputcsv($output, array('Column 1', 'Column 2', 'Column 3'));

// Los datos
mysql_connect('localhost', 'username', 'password');
mysql_select_db('database');
$rows = mysql_query('SELECT field1,field2,field3 FROM table');

// loop en los registros, descargandolos
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row);

La cadena 'datos_descargados.csv' en la línea 3 es el nombre que el navegador le sugerirá para el archivo descargado. El literal de matriz en la línea 9 contiene los títulos de las columnas; esta línea se debe omitir por completo si usted no desea incluir encabezados de columna. Las cadenas en líneas de 12 a 14 deben cambiar a los parámetros de conexión correspondientes y cadena de consulta de la base de datos. En una aplicación real de los parámetros de conexión de base de datos deben ser definidos como constantes en un archivo de configuración independiente.

2. ¿Cómo funciona?


El código tiene que decirle al navegador que se está produciendo un archivo CSV y que el archivo debe ser ofrecido para su descarga, en lugar de mostrarlo en el navegador. Línea 2 produce un encabezado HTTP decirle al navegador que el tipo MIME del contenido es text / csv, el tipo oficial MIME para los archivos CSV.

Línea 3 produce un encabezado 'Content-Disposition'. El encabezado Content-Disposition se define en el RFC 2183 y fue diseñado para ser utilizado en los correos electrónicos, pero también fue adoptado por los navegadores web. En navegadores web el valor 'apego' indica al navegador que ofrecerá el archivo para su descarga con el nombre sugerido - el archivo podría de otro modo se mostrará en la ventana del navegador como si fuera texto normal.

PHP 5.1 introdujo la función fputcsv, que da salida a una serie de datos a un puntero de archivo como valores separados por comas. Debido fputcsv sólo puede escribir en el archivo punteros, la línea 6 se abre la secuencia de salida como si fuera un archivo. Línea 9 entonces emite títulos de las columnas, mientras que la línea 17 bucles más de las filas de datos y les da salida.

jueves, 21 de agosto de 2014

Crear una aplicación de Windows para que funcione siempre como Administrador

Los permisos por defecto en cualquier aplicación que uno desarrolla para Windows, toma por defecto el usuario con el que nos hemos autenticado en Windows.  Esto ocurre por razones de seguridad.  Pero algunas veces necesitamos que nuestra aplicación haga actividades en el PC con permisos administrativos... y generalmente esto genera errores en nuestra aplicación.

El usuario final que tiene en sus manos nuestra aplicación (así recién salida del horno de nuestro cerebro), y con SO Windows 7 o superior, puede darle permisos de ejecución para que se ejecute como administrador.  Pero seamos francos... no podemos depender de lo que haga un usuario (así se lo expliquemos con plastilina).

Para crear una aplicación que siempre se ejecute con permisos de administrador, esto es lo que hay que hacer en nuestro código:

1) Crear el archivo de manifiesto.  En El sitio de MSDN hay un tutorial muy claro de cómo generar este archivo (y un poco largo para ser sinceros). Resumiendo: En Propiedades del proyecto, ingresamos en la pestaña de "Aplicación" y pulsamos el botón de "Ver configuración de Windows".  Esto generará un archivo automáticamente llamado app.manifiest


2) Modificando el archivo app.manifiest.  Abrimos el archivo recién generado y cambiamos la configuración de requestedExecutionLevel.  Debe quedar con la siguiente sintaxis: <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
En el archivo generado, hay varias opciones de ejemplo de lo que podemos hacer en cuanto a seguridad se trata, pero para nuestro objetivo de éste artículo pondremos el recien mencionado.


De esta manera, al ejecutar nuestra aplicación en Windows, sin importar cuál sea el usuario desde el que se está ejecutando la aplicación, tendrá como prioridad la ejecución "como administrador".

Esto es solo la mitad de la solución.  Porque el usuario, puede desde modificar sus permisos administrativos sobre cada aplicación y declarar nuestra aplicación como no apta para ser ejecutada con rol administrativo.  Entonces es necesario hacer una validación a nivel de código:

En VB.NET:

Imports System.Security.Principal
 
If myPrincipal.IsInRole(WindowsBuiltInRole.Administrator) = false Then
   MsgBox ("Requiere permisos administrativos para ejecutar esta aplicación")
End If 


En C#.NET:

using System.Security.Principal;
 
If (myPrincipal.IsInRole(WindowsBuiltInRole.Administrator) == false) {
MsgBox ("Requiere permisos administrativos para ejecutar esta aplicación"); 
}
 
 

jueves, 14 de agosto de 2014

No se puede insertar el valor NULL en la columna 'cualquiera', tabla 'bd.esquema.tabla'. La columna no admite valores NULL. Error de INSERT. Se terminó la instrucción.


Volvemos a las migraciones entre servidores... éste es a veces un problema que se nos presenta cuando ya hemos hecho casi de todo y creíamos que nuestra base de datos quedó bien respaldada y bien montada.

...pues no. No quedó bien respaldada y mucho menos bien montada. Y nos damos totazos contra la pared porque ya no hay marcha atrás y no tenemos acceso al servidor original. ¿Qué hacer?

Primero que todo alejemos al cliente un ratico a que se tome un café para que no nos respire en el cuello y nos remangamos la camisa... esto es lo que hay que hacer:

Entendiendo el problema


Sucede que al respaldar la base de datos de nuestro proyecto, no incluimos sus propiedades extendidas, y al montarla, se perdieron los índices, claves principales y autonuméricos.

Esto puede ser un grave problema si no tienes a la mano un manual de la base de datos (o una formidable memoria), para recordar cuáles campos hay que volver a colocar los índices, claves principales y autonuméricos.

Solucionando poco a poco


La buena noticia, es que hay solución.  La mala, es que es tediosa.  Hay que volver a asignarle los índices y autonuméricos a nuestras tablas de manera manual.

1) Valida que en el nuevo servidor si puedas hacer cambios en la base de datos. ¿Por qué? Es posible que te aparezca un mensaje al momento de guardar un índice que dice literalmente "No se permite guardar. Los cambios que ha realizado requieren que se quiten y vuelvan a crear las siguientes tablas. Quizá ha realizado cambios en una tabla que no se puede volver a crear o ha habilitado la opción Impedir guardar cambios que requieran volver a crear tablas".

El SQL Server Management Studio el viene con la opción "Impedir guardar cambios que requieran volver a crear tablas" habilitada de manera predeterminada, si olvida colocarle un campo, lo nombra mal o deja mal el tipo de dato esto evita que guarde las modificaciones.  Para cambiar esto, simplemente ingresa en el SQL Server Management Studio por Herramientas -> Opciones y en la ventana busca al lado izquierdo del árbol la opción de "Diseñadores" deshabilita esta opción. Así como se ve en la imagen de ejemplo:

2) Acceder a las columnas en las tablas para modificarlas.

Entrar en el diseño de cada una de las tablas para modificarles sus propiedades.  Esto lo haces simplemente con el botón derecho sobre cada tabla y pulsando la opción de "Diseño".


3) Asignar los índices principales en las columnas de las tablas.
Segun cada tipo de dato en tus tablas:

  • Uniqueidentifier. 1) Seleccionar la columna del Indice principal. 2) Pulsar el botón de "Establecer clave principal". 3) En la propiedad de "Valor o enlace predeterminado" ponerle el valor de "NEWID()". 4) Guardar. De esta manera, queda lista la columna con llave principal y auto asignación de un nuevo valor:
 
  • Int, Bigint. Aplica para los tipos de datos enteros y es muy similar al anterior. 1) Seleccionar la columna del Indice principal. 2) Pulsar el botón de "Establecer clave principal". 3) En la propiedad de "Especificación de Identidad" en el campo de (Identidad) ponerle el valor de "SI". 4) Guardar.

Como decía anteriormente, puede que no todo esté perdido, pero el no haber guardado bien un respaldo de base de datos, nos puede poner en un trabajo un poco más largo.

martes, 29 de julio de 2014

System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.

En una reciente migración de un servidor, nos topamos con este mensaje de error, cuando nuestra aplicación de ASP.NET intentaba conectar con el servidor de base de datos de Oracle.

El mensaje cuando lanzaba cualquier consulta era el mismo:

System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.


Existen dos posibilidades para este error.

Recordemos que estamos en una nueva máquina y que estamos tratando de acceder a la BD de Oracle desde nuestra aplicación de ASP.NET.

Las causas pueden ser dos muy diferentes:
  1. No se ha instalado el Microsoft OLE DB provider for Oracle.
  2. La carpeta de la instalación de Oracle no tiene permiso para el usuario de ASP.NET

Si se trata del primer caso, lo más seguro es que luego hay que atender también el segundo caso.

1. Instalar Microsoft OLE DB provider for Oracle.  


Los enlaces de descarga se pueden encontrar en:
http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html

Es necesario conocer muy bien la máquina y el sistema operativo que se tiene en el servidor para seleccionar el enlace adecuado.

 2. Dar permisos administrativos a la carpeta de Oracle


El procedimiento es sencillo:

  • Dar permisos sobre la carpeta de Oracle a los usuarios “Authenticated Users” y “ASP.net”
  • Loguearse a Windows con credenciales administrativas.
  • Ir a la carpeta raíz de Oracle que generalmente se encuentra en: C:\Oracle.
  • Ir a las propiedades de la carpeta y seleccionar la pestaña “Seguridad”.
  • Click on “Authenticated Users” item in the “Name” list.
  • Agregar los usuarios “Authenticated Users” y “ASP.net” y asignarles permisos de “Full Control”.
  • Dar clic en el botón “Avanzado”, se eligen los usuarios mencionados anteriormente y se seleccionar las opciones “Permitir que los permisos heredables del primario se propaguen a este objeto y a todos los objetos secundarios. Incluirlos junto con las entradas indicadas aquí de forma explícita” y “Reemplazar las entradas de permisos en todos los objetos secundarios con aquellas entradas incluidas aquí y que sean relativas a los objetos secundarios”.
  • Dar clic en OK y reiniciar el equipo para asegurarse de que los cambios surtan efecto.

NOTA IMPORTANTE


"Reiniciar la máquina."

Aquí no hay experiencia que valga... o se reinicia la máquina o todo lo mencionado en este artículo puede quedar en el papel con que vamos a limpiar los vídrios.

jueves, 8 de mayo de 2014

Video de YouTube autoadaptable responsive con DIV y CSS

Ahora los sitios WEB deben ser autoadaptables para cualquier tipo de dispositivo. Alegría para los lectores y dolor de cabeza para los programadores y diseñadores... pero bueno, así es como nos ganamos la vida.

En un antojo de un cliente de una tienda virtual en el Centro Comercial Virtual NetU21, nos vimos involucrados con un requerimiento nuevo: que el Slider de fotografías soportara también videos.  Teniendo en cuenta que las tiendas virtuales tienen un formato responsive 100% y que los sliders cumplen con dicho requerimiento, y algunos de los tipos de sliders son generados con texto animado... nuestra primera reacción fue: "Eso no se puede".

Durante una semana más o menos vine jugando con la idea de como hacer el slider responsive y que soportara también videos inmersos de YouTube.  Pues bien, aquí está la solución para hacer que nuestros videos, queden automáticamente responsive en nuestros portales, indiferente del lugar donde los hayamos incluido.

1) Es necesario encerrar el código que nos suministra YouTube con un DIV especial, que será el que controlaremos por hoja de estilos.
2) Hay que especificar en la hoja de estilos que este DIV tendrá un 50% o 60% de padding bottom, y luego los TAG hijos (iframe, object embed) con posición absoluta y 100% a lo ancho y alto. Esto los forzará a expandirse automáticamente.

Así debe quedar en la hoja de estilos:

CSS

.video-container {
    position: relative;
    padding-bottom: 56.25%;
    padding-top: 30px; height: 0; overflow: hidden;
}

.video-container iframe,
.video-container object,
.video-container embed {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

HTML

<div class="video-container">
         <iframe width="640" height="480" src="//www.youtube.com/embed/yT6GA_EKmuc" frameborder="0" allowfullscreen></iframe>
</div>

RESULTADO


Si todo ha funcionado bien hasta ahora, entonces el video se verá muy bien, no importa en que dispositivo se estará mostrando: tablets, moviles, PC, etc.

Y ahora si... pueden hacer el baile de celebración!

jueves, 24 de abril de 2014

Error con date_default_timezone_set() en PHP

El Error:

date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin*' for 'CEST/2.0/DST' instead.

*...o cualquier otro sitio de este hermoso planeta.

Se nos ha presentado este error una vez montado el proyecto en el servidor, y puede ser por varias causas:
  • Nos han cambiado la versión de PHP.  Es decir, han actualizado la versión de PHP a una superior a 5.1.
  • No hemos incluido la linea de configuración de fecha en el servidor en nuestro código.  Esto es necesario si no se maneja en el php.ini
  • No hemos incluido la validación de la fecha y zona en nuestro php.ini
  • El servidor se enloqueció de la noche a la mañana.

Para darle solución a este detalle, primero que todo, supongamos que no se trata de la última causa.  Entonces demos solución en el código de nuestro archivo de PHP.


Muy al comienzo, antes de hacer uso de cualquier función date(). Debemos indicarle al servidor cuál es nuestra zona horaria con la siguiente instrucción:

Solución en el código:

<?php
date_default_timezone_set("America/Bogota"); //Configuramos el timezone
echo date_default_timezone_get(); // Vemos qué ha quedado configurado
//...de aqui en adelante el resto de nuestro código
?> 

Solución en el archivo php.ini:
[Date]
; Defines the default timezone used by the date functions
date.timezone = America/Chicago

No importa si el servidor se encuentra físicamente en otro país, la coniguración que aquí indicamos va a determinar los resultados de las funciones de fecha y tiempo en nuestra aplicación.

Aquí les dejo el listado de opciones que he podido encontrar buscando en la red:
  • Africa/Abidjan
  • Africa/Accra
  • Africa/Addis_Ababa
  • Africa/Algiers
  • Africa/Asmara
  • Africa/Asmera
  • Africa/Bamako
  • Africa/Bangui
  • Africa/Banjul
  • Africa/Bissau
  • Africa/Blantyre
  • Africa/Brazzaville
  • Africa/Bujumbura
  • Africa/Cairo
  • Africa/Casablanca
  • Africa/Ceuta
  • Africa/Conakry
  • Africa/Dakar
  • Africa/Dar_es_Salaam
  • Africa/Djibouti
  • Africa/Douala
  • Africa/El_Aaiun
  • Africa/Freetown
  • Africa/Gaborone
  • Africa/Harare
  • Africa/Johannesburg
  • Africa/Kampala
  • Africa/Khartoum
  • Africa/Kigali
  • Africa/Kinshasa
  • Africa/Lagos
  • Africa/Libreville
  • Africa/Lome
  • Africa/Luanda
  • Africa/Lubumbashi
  • Africa/Lusaka
  • Africa/Malabo
  • Africa/Maputo
  • Africa/Maseru
  • Africa/Mbabane
  • Africa/Mogadishu
  • Africa/Monrovia
  • Africa/Nairobi
  • Africa/Ndjamena
  • Africa/Niamey
  • Africa/Nouakchott
  • Africa/Ouagadougou
  • Africa/Porto-Novo
  • Africa/Sao_Tome
  • Africa/Timbuktu
  • Africa/Tripoli
  • Africa/Tunis
  • Africa/Windhoek
  • America/Adak
  • America/Anchorage
  • America/Anguilla
  • America/Antigua
  • America/Araguaina
  • America/Argentina/Buenos_Aires
  • America/Argentina/Catamarca
  • America/Argentina/ComodRivadavia
  • America/Argentina/Cordoba
  • America/Argentina/Jujuy
  • America/Argentina/La_Rioja
  • America/Argentina/Mendoza
  • America/Argentina/Rio_Gallegos
  • America/Argentina/San_Juan
  • America/Argentina/Tucuman
  • America/Argentina/Ushuaia
  • America/Aruba
  • America/Asuncion
  • America/Atikokan
  • America/Atka
  • America/Bahia
  • America/Barbados
  • America/Belem
  • America/Belize
  • America/Blanc-Sablon
  • America/Boa_Vista
  • America/Bogota
  • America/Boise
  • America/Buenos_Aires
  • America/Cambridge_Bay
  • America/Campo_Grande
  • America/Cancun
  • America/Caracas
  • America/Catamarca
  • America/Cayenne
  • America/Cayman
  • America/Chicago
  • America/Chihuahua
  • America/Coral_Harbour
  • America/Cordoba
  • America/Costa_Rica
  • America/Cuiaba
  • America/Curacao
  • America/Danmarkshavn
  • America/Dawson
  • America/Dawson_Creek
  • America/Denver
  • America/Detroit
  • America/Dominica
  • America/Edmonton
  • America/Eirunepe
  • America/El_Salvador
  • America/Ensenada
  • America/Fort_Wayne
  • America/Fortaleza
  • America/Glace_Bay
  • America/Godthab
  • America/Goose_Bay
  • America/Grand_Turk
  • America/Grenada
  • America/Guadeloupe
  • America/Guatemala
  • America/Guayaquil
  • America/Guyana
  • America/Halifax
  • America/Havana
  • America/Hermosillo
  • America/Indiana/Indianapolis
  • America/Indiana/Knox
  • America/Indiana/Marengo
  • America/Indiana/Petersburg
  • America/Indiana/Vevay
  • America/Indiana/Vincennes
  • America/Indiana/Winamac
  • America/Indianapolis
  • America/Inuvik
  • America/Iqaluit
  • America/Jamaica
  • America/Jujuy
  • America/Juneau
  • America/Kentucky/Louisville
  • America/Kentucky/Monticello
  • America/Knox_IN
  • America/La_Paz
  • America/Lima
  • America/Los_Angeles
  • America/Louisville
  • America/Maceio
  • America/Managua
  • America/Manaus
  • America/Martinique
  • America/Mazatlan
  • America/Mendoza
  • America/Menominee
  • America/Merida
  • America/Mexico_City
  • America/Miquelon
  • America/Moncton
  • America/Monterrey
  • America/Montevideo
  • America/Montreal
  • America/Montserrat
  • America/Nassau
  • America/New_York
  • America/Nipigon
  • America/Nome
  • America/Noronha
  • America/North_Dakota/Center
  • America/North_Dakota/New_Salem
  • America/Panama
  • America/Pangnirtung
  • America/Paramaribo
  • America/Phoenix
  • America/Port-au-Prince
  • America/Port_of_Spain
  • America/Porto_Acre
  • America/Porto_Velho
  • America/Puerto_Rico
  • America/Rainy_River
  • America/Rankin_Inlet
  • America/Recife
  • America/Regina
  • America/Resolute
  • America/Rio_Branco
  • America/Rosario
  • America/Santiago
  • America/Santo_Domingo
  • America/Sao_Paulo
  • America/Scoresbysund
  • America/Shiprock
  • America/St_Johns
  • America/St_Kitts
  • America/St_Lucia
  • America/St_Thomas
  • America/St_Vincent
  • America/Swift_Current
  • America/Tegucigalpa
  • America/Thule
  • America/Thunder_Bay
  • America/Tijuana
  • America/Toronto
  • America/Tortola
  • America/Vancouver
  • America/Virgin
  • America/Whitehorse
  • America/Winnipeg
  • America/Yakutat
  • America/Yellowknife
  • Antarctica/Casey
  • Antarctica/Davis
  • Antarctica/DumontDUrville
  • Antarctica/Mawson
  • Antarctica/McMurdo
  • Antarctica/Palmer
  • Antarctica/Rothera
  • Antarctica/South_Pole
  • Antarctica/Syowa
  • Antarctica/Vostok
  • Arctic/Longyearbyen
  • Asia/Aden
  • Asia/Almaty
  • Asia/Amman
  • Asia/Anadyr
  • Asia/Aqtau
  • Asia/Aqtobe
  • Asia/Ashgabat
  • Asia/Ashkhabad
  • Asia/Baghdad
  • Asia/Bahrain
  • Asia/Baku
  • Asia/Bangkok
  • Asia/Beirut
  • Asia/Bishkek
  • Asia/Brunei
  • Asia/Calcutta
  • Asia/Choibalsan
  • Asia/Chongqing
  • Asia/Chungking
  • Asia/Colombo
  • Asia/Dacca
  • Asia/Damascus
  • Asia/Dhaka
  • Asia/Dili
  • Asia/Dubai
  • Asia/Dushanbe
  • Asia/Gaza
  • Asia/Harbin
  • Asia/Hong_Kong
  • Asia/Hovd
  • Asia/Irkutsk
  • Asia/Istanbul
  • Asia/Jakarta
  • Asia/Jayapura
  • Asia/Jerusalem
  • Asia/Kabul
  • Asia/Kamchatka
  • Asia/Karachi
  • Asia/Kashgar
  • Asia/Katmandu
  • Asia/Krasnoyarsk
  • Asia/Kuala_Lumpur
  • Asia/Kuching
  • Asia/Kuwait
  • Asia/Macao
  • Asia/Macau
  • Asia/Magadan
  • Asia/Makassar
  • Asia/Manila
  • Asia/Muscat
  • Asia/Nicosia
  • Asia/Novosibirsk
  • Asia/Omsk
  • Asia/Oral
  • Asia/Phnom_Penh
  • Asia/Pontianak
  • Asia/Pyongyang
  • Asia/Qatar
  • Asia/Qyzylorda
  • Asia/Rangoon
  • Asia/Riyadh
  • Asia/Riyadh87
  • Asia/Riyadh88
  • Asia/Riyadh89
  • Asia/Saigon
  • Asia/Sakhalin
  • Asia/Samarkand
  • Asia/Seoul
  • Asia/Shanghai
  • Asia/Singapore
  • Asia/Taipei
  • Asia/Tashkent
  • Asia/Tbilisi
  • Asia/Tehran
  • Asia/Tel_Aviv
  • Asia/Thimbu
  • Asia/Thimphu
  • Asia/Tokyo
  • Asia/Ujung_Pandang
  • Asia/Ulaanbaatar
  • Asia/Ulan_Bator
  • Asia/Urumqi
  • Asia/Vientiane
  • Asia/Vladivostok
  • Asia/Yakutsk
  • Asia/Yekaterinburg
  • Asia/Yerevan
  • Atlantic/Azores
  • Atlantic/Bermuda
  • Atlantic/Canary
  • Atlantic/Cape_Verde
  • Atlantic/Faeroe
  • Atlantic/Faroe
  • Atlantic/Jan_Mayen
  • Atlantic/Madeira
  • Atlantic/Reykjavik
  • Atlantic/South_Georgia
  • Atlantic/St_Helena
  • Atlantic/Stanley
  • Australia/ACT
  • Australia/Adelaide
  • Australia/Brisbane
  • Australia/Broken_Hill
  • Australia/Canberra
  • Australia/Currie
  • Australia/Darwin
  • Australia/Eucla
  • Australia/Hobart
  • Australia/LHI
  • Australia/Lindeman
  • Australia/Lord_Howe
  • Australia/Melbourne
  • Australia/NSW
  • Australia/North
  • Australia/Perth
  • Australia/Queensland
  • Australia/South
  • Australia/Sydney
  • Australia/Tasmania
  • Australia/Victoria
  • Australia/West
  • Australia/Yancowinna
  • Brazil/Acre
  • Brazil/DeNoronha
  • Brazil/East
  • Brazil/West
  • CET
  • CST6CDT
  • Canada/Atlantic
  • Canada/Central
  • Canada/East-Saskatchewan
  • Canada/Eastern
  • Canada/Mountain
  • Canada/Newfoundland
  • Canada/Pacific
  • Canada/Saskatchewan
  • Canada/Yukon
  • Chile/Continental
  • Chile/EasterIsland
  • Cuba
  • EET
  • EST
  • EST5EDT
  • Egypt
  • Eire
  • Etc/GMT
  • Etc/GMT+0
  • Etc/GMT+1
  • Etc/GMT+10
  • Etc/GMT+11
  • Etc/GMT+12
  • Etc/GMT+2
  • Etc/GMT+3
  • Etc/GMT+4
  • Etc/GMT+5
  • Etc/GMT+6
  • Etc/GMT+7
  • Etc/GMT+8
  • Etc/GMT+9
  • Etc/GMT-0
  • Etc/GMT-1
  • Etc/GMT-10
  • Etc/GMT-11
  • Etc/GMT-12
  • Etc/GMT-13
  • Etc/GMT-14
  • Etc/GMT-2
  • Etc/GMT-3
  • Etc/GMT-4
  • Etc/GMT-5
  • Etc/GMT-6
  • Etc/GMT-7
  • Etc/GMT-8
  • Etc/GMT-9
  • Etc/GMT0
  • Etc/Greenwich
  • Etc/UCT
  • Etc/UTC
  • Etc/Universal
  • Etc/Zulu
  • Europe/Amsterdam
  • Europe/Andorra
  • Europe/Athens
  • Europe/Belfast
  • Europe/Belgrade
  • Europe/Berlin
  • Europe/Bratislava
  • Europe/Brussels
  • Europe/Bucharest
  • Europe/Budapest
  • Europe/Chisinau
  • Europe/Copenhagen
  • Europe/Dublin
  • Europe/Gibraltar
  • Europe/Guernsey
  • Europe/Helsinki
  • Europe/Isle_of_Man
  • Europe/Istanbul
  • Europe/Jersey
  • Europe/Kaliningrad
  • Europe/Kiev
  • Europe/Lisbon
  • Europe/Ljubljana
  • Europe/London
  • Europe/Luxembourg
  • Europe/Madrid
  • Europe/Malta
  • Europe/Mariehamn
  • Europe/Minsk
  • Europe/Monaco
  • Europe/Moscow
  • Europe/Nicosia
  • Europe/Oslo
  • Europe/Paris
  • Europe/Podgorica
  • Europe/Prague
  • Europe/Riga
  • Europe/Rome
  • Europe/Samara
  • Europe/San_Marino
  • Europe/Sarajevo
  • Europe/Simferopol
  • Europe/Skopje
  • Europe/Sofia
  • Europe/Stockholm
  • Europe/Tallinn
  • Europe/Tirane
  • Europe/Tiraspol
  • Europe/Uzhgorod
  • Europe/Vaduz
  • Europe/Vatican
  • Europe/Vienna
  • Europe/Vilnius
  • Europe/Volgograd
  • Europe/Warsaw
  • Europe/Zagreb
  • Europe/Zaporozhye
  • Europe/Zurich
  • Factory
  • GB
  • GB-Eire
  • GMT
  • GMT+0
  • GMT-0
  • GMT0
  • Greenwich
  • HST
  • Hongkong
  • Iceland
  • Indian/Antananarivo
  • Indian/Chagos
  • Indian/Christmas
  • Indian/Cocos
  • Indian/Comoro
  • Indian/Kerguelen
  • Indian/Mahe
  • Indian/Maldives
  • Indian/Mauritius
  • Indian/Mayotte
  • Indian/Reunion
  • Iran
  • Israel
  • Jamaica
  • Japan
  • Kwajalein
  • Libya
  • MET
  • MST
  • MST7MDT
  • Mexico/BajaNorte
  • Mexico/BajaSur
  • Mexico/General
  • Mideast/Riyadh87
  • Mideast/Riyadh88
  • Mideast/Riyadh89
  • NZ
  • NZ-CHAT
  • Navajo
  • PRC
  • PST8PDT
  • Pacific/Apia
  • Pacific/Auckland
  • Pacific/Chatham
  • Pacific/Easter
  • Pacific/Efate
  • Pacific/Enderbury
  • Pacific/Fakaofo
  • Pacific/Fiji
  • Pacific/Funafuti
  • Pacific/Galapagos
  • Pacific/Gambier
  • Pacific/Guadalcanal
  • Pacific/Guam
  • Pacific/Honolulu
  • Pacific/Johnston
  • Pacific/Kiritimati
  • Pacific/Kosrae
  • Pacific/Kwajalein
  • Pacific/Majuro
  • Pacific/Marquesas
  • Pacific/Midway
  • Pacific/Nauru
  • Pacific/Niue
  • Pacific/Norfolk
  • Pacific/Noumea
  • Pacific/Pago_Pago
  • Pacific/Palau
  • Pacific/Pitcairn
  • Pacific/Ponape
  • Pacific/Port_Moresby
  • Pacific/Rarotonga
  • Pacific/Saipan
  • Pacific/Samoa
  • Pacific/Tahiti
  • Pacific/Tarawa
  • Pacific/Tongatapu
  • Pacific/Truk
  • Pacific/Wake
  • Pacific/Wallis
  • Pacific/Yap
  • Poland
  • Portugal
  • ROC
  • ROK
  • Singapore
  • Turkey
  • UCT
  • US/Alaska
  • US/Aleutian
  • US/Arizona
  • US/Central
  • US/East-Indiana
  • US/Eastern
  • US/Hawaii
  • US/Indiana-Starke
  • US/Michigan
  • US/Mountain
  • US/Pacific
  • US/Pacific-New
  • US/Samoa
  • UTC
  • Universal
  • W-SU
  • WET
  • Zulu

lunes, 21 de abril de 2014

Server Error in '/' Application. Runtime error .NET

Cuando montamos nuestro proyecto en el servidor de .NET (por fín!), y en medio de la alegría, el entusiasmo y motivación nos hacen sentir como que nuestro hijo va a ser presentado en sociedad, es cuando nos cae un balde de agua fría al ver el siguiente error en pantalla:


Hay muchas maneras de tomar este error, la que siempre recomiendo es, antes que nada: ir por un café!  Y luego seguir con los pasos básicos para atenderlo.

¿Por qué tengo este error, si en desarrollo y pruebas no estaba?


Realmente nunca un entorno de desarrollo, uno de pruebas y uno de producción son iguales (así te lo digan en medio de un juramento hipocrático). Por lo tanto, hay varias cosas que pudieron salir mal.

Lo que es necesario entender en este momento, es que realmente no estas viendo un error de tu aplicación, es un mensaje generalizado, que te dice que NO te va a mostrar el error, pero que "Hay un error" (pero no te lo va a mostrar, peró si está).  Entonces el primer paso, es configurar el montaje en el servidor para ver el detalle del "error de nuestro trabajo".

Algunas causas que generalmente producen este error son:
  1. La aplicación se ha construido para una versión diferente de Framework a la que está corriendo en el servidor.
  2. Falta un parámetro de configuración en el web.config y se está utilizando en el código de nuestro proyecto.
  3. Faltó subir un ensamblado .dll a la carpeta bin.
  4. Publicamos archivos .aspx que no concuerdan con los .dll de la carpeta bin.
  5. No se han borrado algunos archivos viejos .dll de versiones anteriores y ahora hay conflicto entre los nuevos .dll que hay en la carpeta bin
  6. Algunas de las librerías de terceros (.dll) están compiladas para una versión diferente de Framework que la del servidor en donde montamos nuestro proyecto.
  7. No hicimos pruebas antes de montar al servidor y el error siempre ha existido en nuestro código.
  8. El servidor no nos quiere. (Esta causa no está documentada en MSDN)

Haciendo trabajo de detectives.


Primero que todo, ese no es el verdadero error, hay que indagar para saber cuál ha sido el error, entonces estos son pasos para poder ver el verdadero error:
  1. Saber exactamente cuál es la versión del Framework .NET del servidor y puede ser cualquiera de las siguientes opciones: 2.0, 3.0, 3.5 y 4.0.  Dependiendo de la Versión, hay diferentes alternativas, pero la general es como la menciono a continuación.
  2. En el archivo web.config buscar la cadena (así no exista esta configuración, así debe estar por defecto)
     <customErrors mode="RemoteOnly" />
     
  3. Cambiar el valor de mode por Off y debe quedar así:
    <customErrors mode="Off" />
     
Al ingresar de nuevo al sitio (o simplemente pulsando F5), debemos ver un error completamente diferente, el verdadero, el que nos ha dejado sin dormir, el que hay que corregir.

Para todos aquellos que llegaron a ver este desdichado artículo, los remito al lugar que debieron haber leído primero, para conocer un poco más del tema, del directamente responsable de su existencia: Microsoft y su documentación respecto a Elemento customErrors (Esquema de configuración de ASP.NET).


7 razones para no usar Laravel en tu proyecto de PHP

En más de 40 años de experiencia como programador y director de proyectos de programación, he aprendido que cada requerimiento tiene mejores...