miércoles, 26 de marzo de 2008

HTTP 401.3 - Access denied by ACL on resource

Moviendo, borrando y copiando carpetas de aplicaciones web dentro del IIS, me aparecio este error al momento de ejecutar algunas de las aplicaciones en cuestion.

Cuando hacemos estos tipos de operaciones (moviendo, eliminando carpetas) se pierden los permisos de lectura o/y escrituras de algunos usuarios que utiliza el IIS. La solucion es verificar los permisos de dichas carpetas y asignarle privilegios de lectura (como minimo) al usuario que utiliza el IIS (por lo general IUSR_NOMBREDELEQUIPO) y al usuario ASPNET en caso de que sean aplicaciones .Net.

miércoles, 19 de marzo de 2008

Mono: error CS0433: The imported type `XXXXX' is defined multiple times

Intentando de correr una aplicacion en Mono obtuve el siguiente mensaje de error:

Compilation Error

Description: Error compiling a resource required to service this request. Review your source file and modify it to fix this error.

Error message:

/var/tmp/www-temp-aspnet-0/a9e8b93/759bb5af.0.cs(28,41) : error CS0433: The imported type `_Default' is defined multiple times


A simple vista parece un error de compilacion ocasionado por nosotros mismos al desarrollar la aplicacion, algo que esta definido varias veces en un mismo contexto, por lo cual si es un error de esa naturaleza, pues compilarlo en Visual Studio deberia de dar el mismo error o algo parecido, pero no es asi, en el FrameWork.Net de windows trabaja sin ningun problema.

Buscando en la red, no encontre nada parecido, ni una pista, perdi mucho tiempo indagando y en la red no estaba la solucion. Ya estaba por pensar que la implementacion de Mono no estaba muy acabada como para migrar y correr aplicaciones rubustas desarrollada en .Net de Windows (claro, sin incluir componentes o recursos de terceros que solo trabajan en un ambiente win)


Pues bien, observando detenidamente el error, me fijaba que el problema estaba en la declaracion de una pagina (_Default) que unicamente contenia un masterpage y luego en su interior estaba totalmente vacia. Pero la aplicacion completa contenia unos 6 masterpage adicionales, porque concretamente esta es la del problema? o quizas todas tenian el mismo problema y esta era la primera en detectarse? que rompecabezas :S

Pero la solucion era tan sencilla que era muy dificil de imaginar: la pagina que se daba como referencia en el error, es una pagina que estaba repetida varias veces dentro de otras carpetas, o sea, identica, mismos nombres, mismas declaraciones en el codebehind. El Framework de windows pasa desapersivido esto, pero Mono no.

Pagina 1:
public partial class _Default : System.Web.UI.Page

Pagina 2:
public partial class _Default : System.Web.UI.Page

No pueden existir dos clases con los mismos nombres en un mismo contexto, aunque esten ubicados fisicamente en sitios diferentes.

Solucion: eliminar las paginas repetidas o renombrar sus declaraciones en el codebehind


martes, 18 de marzo de 2008

Mono - HTTP 500. System.DllNotFoundException: gdiplus.dll



Intentando de correr una aplicacion en Mono+FreeBSD obtuve el siguiente mensaje de error:

HTTP 500. System.DllNotFoundException: gdiplus.dll

Y en otras paginas tambien obtuve este error:

Parser Error: Color Red is not a valid color



Ambos errores son relacionados y se resuelven con la misma medicina.

Ahora bien, detallemos que sucede, el primer error me habla que me falta una dll llamada gdiplus.dll, pero que es esto ?

Microsoft GDI+ (gdiplus.dll) es una librería que contiene funciones básicas relacionadas con el sistema de interfaz gráfico de Windows (GDI) Graphical Device Interface. Gracias a este sistema Windows puede crear y mostrar objetos en 2D.

Si nuestra aplicacion web esta usando librerias de manejo de imagenes, para manipular su
tamaño, preservar la calidad al momento de desplegarla utilizando otras dimensiones, etc.
Nuestra aplicacion esta haciendo un llamado a esta libreria. En mi caso, mi proyecto .net
hace algunas de estas cosas

En FreeBSD esta libreria no viene con la instalacion de Mono, tenia que instalarla primero antes
mapiar la DLL. La libreria esta ubicada en /usr/ports/X11/x11-toolkit/libgdiplus

procedemos a instalar
make install clean

Pero me encontre con una sorpresa, existia un conflicto de instalacion

/usr/X11R6 exists, but it is not a symlink. Installation cannot proceed.
This looks like an incompletely removed old version of X. In the current version, /usr/X11R6 must be a symlink if it exists at all.Please read /usr/ports/UPDATING (entry of 20070519) for the procedure to upgrade X.org related ports.
*** Error code 1

Al parecer, segun el mensaje de error, nos manda actualizar las X, pero al ver las dependencias del paquete libgdiplus dice que la version de X es la misma que tengo instalada, ademas me parecio problematico actualizar las X ya que otros paquetes dependian de esta misma version y adicional a esto el mensaje de error da una pista de como resolver el problema sin tener que actualizar: /usr/X11r6 debe ser un enlace de sistema, no un directorio real.

Solucion: mover todo el contenido de /usr/X11R6 a /usr/local

cd /usr/X11r6
find -d . -print | cpio -pvdam /usr/local

Entonces borrar X11r6 y crearlo como un enlace de sistema apuntando a /usr/local

rm -r /usr/X11R6 && ln -s /usr/local /usr/X11R6

luego de esto, por fin instalar la libreria sin mas inconveniente

cd /usr/ports/X11/x11-toolkit/libgdiplus && make install clean

viernes, 14 de marzo de 2008

Firebird en FreeBSD: inet server err: setting KEEPALIVE socket option

Al observar que mi base de datos esta lista para iniciar no termina de arrancar, verificando el /var/db/firebird/firebird.log me encuentro con el siguiente mensaje:

inet server err: setting KEEPALIVE socket option

Solucion:

Firebird trata de utilizar un metodo llamado "Nagle algorithm" para las conecciones tcp/ip
y en FreeBSD esto es posible trabajarlo solo con un usuario con suficientes privilegios "ROOT"

En la linea agregada para iniciar la base de datos en el inetd.conf debemos cambiar el usuario firebird por el root:

gds_db stream tcp nowait root /usr/local/sbin/fb_inet_server fb_inet_server

En caso de que no deseemos correr el servicio de la db con root, entonces deshabilitamos el uso del Nagle en el archivo de configuracion de la base de datos:

edit /usr/local/etc/firebird/firebird.conf
TcpNoNagle = 0 # indicando el valor cero

Segun una documentacion encontrada por el internet, pero lo probe y no funciono, quizas algo me falto hacer.

jueves, 13 de marzo de 2008

FbMembershipProvider.CreateUser - validation error for column ISONLINE, value *** null ***

Migrando un membership a FireBird me encontre con un #@$@#$# error que me llevo casi todo un dia descubrir lo que sucedia:

validation error for column ISONLINE, value "*** null ***"

Este error me era arrojado en el event view de windows al fallar la creacion de un nuevo usuario.

Despues de revisar el store procedure que inserta un nuevo usuario, pasarme casi toda la mañana verificando la DB, los tipos de datos de los campos y hacer algunas pruebas insertando directamente con el mismo SP, me di cuenta que todo estaba bien, y que el error provenia de la clase FbMembershipProvider.

Busque por google exactamente el mensaje que me arrojaba y nada! Pero si encontre que habian algunos errores con la creacion de usuarios en algunas versiones mas viejas del FbMembershipProvider. Verificando el codigo fuente del Provider.Net de FireBird, observe que habian dos clases FbMembershipProvider y FbMembershipProvider2, esta ultima es mas completa y terminada. Cambie mi referencia en el web.config del MembershipProvider:

type="FirebirdSql.Web.Providers.FbMembershipProvider,FirebirdSql.Web.Providers, Version=2.0.0.0,Culture=neutral,PublicKeyToken=3d06a02581b682f8"

a:

type="FirebirdSql.Web.Providers.FbMembershipProvider2,FirebirdSql.Web.Providers, Version=2.0.0.0,Culture=neutral,PublicKeyToken=3d06a02581b682f8"

Todo era porque no estaba usando la version la version "2"

La verdad es que la documentacion es muy pobre, hay que buscarsela e ingeniarsela a no mas poder con esto para dar con la solucion. Incluso, si la version 1 tiene Bugs que se corrigen con la 2, no veo cual es el sentido de tener las dos disponibles, lo cual puede prestar a confunsion, ya que los pocos ejemplo que podemos encontrar para la implementacion del FbMembershipProvider no hace mension de la version corregida FbMembershipProvider2

miércoles, 12 de marzo de 2008

Arrancar FireBird al iniciar el sistema en FreeBSD


La instalacion de Firebird2 desde los ports no deja el sistema listo para arrancar la base de datos en la proxima reiniciada, hay que hacerlo manual:

agregar en /etc/services la siguente linea:
gds_db 3050/tcp # FireBird DataBase

agregar en /etc/inetd.conf la siguiente linea:
gds_db stream tcp nowait firebird /usr/local/sbin/fb_inet_server fb_inet_server

Luego reiniciar servicios para tener nuestro Firebird listo para trabajar:
/etc/rc.d/inetd restat

O reiniciar el sistema para comprobar que esta iniciando:
reboot

Instalacion de FireBird en FreeBSD

Instalando Firebird desde los ports en FreeBSD 6.2. Primer error encontrado en la instalacion:

===> Building for firebird-client-2.0.1
==> Please do not build firebird as 'root' because this may cause
conflicts with SysV semaphores of running services.
*** Error code 1

Stop in /usr/ports/databases/firebird2-client.
*** Error code 1

Stop in /usr/ports/databases/firebird2-server.

Solucion

Dar permisos necesarios a un usuario no root a las carpetas de
firebird2-client y firebird2-server estando logueado como root

chown -R usuario /usr/ports/databases/firebird2-server
chown -R usuario /usr/ports/databases/firebird2-client

entrar como el usuario con los nuevos privilegios

su usuario
cd /usr/ports/databases/firebird2-server
make

volver como root y terminar de instalar

exit
make install clean