Error en IIS BadImageFormatException

Subiendo una aplicación web al servidor me encontré con un error muy raro y que hasta el momento no me había pasado nunca.

Error System.BadImageFormatException !!!

La página del error en el IIS es:

 

La aplicación hasta ese momento estaba funcionando y después de añadirle un nuevo ensamblado  Masivos.Application.Interfaces dejó de funcionar. Lo curioso es que en el servidor de desarrollo funcionaba perfectamente, pero en el servidor de Pre no había manera que funcionara.

Lo primero que tenemos que saber es que la máquina de desarrollo estaba corriendo en un Windows7  32bits y el servidor de Pre en un Windows Server 2008 R2 64 bits.

La configuración de la solución

Lo primero que hay que mirar es la configuración de la solución.

 

A simple vista se ve algo raro, justamente el proyecto que está fallando esta compilando siempre en x86 y eso no es lo correcto, la compilación tendría que ser igual que el resto de proyectos de librerías para Any CPU. Lo peor de todo es que al intentar modificar esta configuración no aparece la opción y solo permite compilar para x86.

El porqué de todo esto

El error está bastante claro: Una DLL o aplicación ejecutable se carga como un ensamblado de 64 bits, pero contiene características o recursos de 32 bits. Por ejemplo, usa la interoperabilidad COM o llama a métodos en una biblioteca de vínculos dinámicos de 32 bits.  http://msdn.microsoft.com/es-es/library/system.badimageformatexception.aspx.

Mis intentos para solucionar el problema pasaron por:

1.       intentar obligar al pool de aplicaciones del IIS en que la solución corriera en x86. FAIL !!

2.       Intentar por todos los medios que el proyecto de Interfaces se compilara en Any CPU. FAIL!!

 

La Solución

 

Lo que me mosqueaba era porque motivo un proyecto de librería no me dejaba poder establecer la compilación en Any CPU y la respuesta surgió cuando el que creó el proyecto comento que en principio seleccionó la plantilla de consola y luego modifico el proyecto a librerías.   Argggg !!!!!

 

 Visual Studio cuando crea un proyecto de consola siempre lo configura como x86 y la única manera de poder cambiar esto es modificando a mano la configuración del proyecto. Pues la solución rápida fue crear un nuevo proyecto directamente de librería y copiar todos los ficheros al nuevo proyecto.  Una vez todos los ensamblados compilados en 64bits el deploy funcionó y todos felices.

Experiencias del día a día de un desarrollador 😉

 

Publicar Servicio WCF en un servidor compartido

Siguiendo con las ayuditas a mis rivales en el concurso Es la hora de los Puños , voy a exponer un error común que nos podemos encontrar al intentar publicar el servicio WCF en un servidor compartido, una configuración muy habitual en nuestros hostings.

El error:

Esta colección ya contiene una dirección con el esquema http. Sólo puede haber una dirección por esquema en esta colección.

image

El Problema:

El servidor web IIS solo permite una sola dirección base por esquema (HTTP) y eso para un entorno compartido es un verdadero problema, esto ya está solucionado en IIS 7.0 y framework 4.0 con el atributo multipleSiteBindingsEnabled en el elemento serviceHostingEnvironment.

Posible solución para versiones anteriores:

Para poder hospedar un servicio WCF con un extremo web en un servidor IIS hay que especificar  la clase WebServiceHostFactory en el archivo .svc

<%@ ServiceHost Language="C#" 
Debug="true" 
Service="KillBits.Fight" 
CodeBehind="Fight.svc.cs"
Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

O en el fichero de configuración estableciendo el binding webHttpBinding

<endpoint address="http://www.lonetcamp.com" 

   binding="webHttpBinding"  contract="KillBits.IFight">

Podemos crear nuestro propio HostFactory heredando de WebServiceHostFactory o WebScriptServiceFactory dependiendo si queremos facilitar el acceso desde script de cliente o solo ASP.NET.

public class CustomHostFactory : WebScriptServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, 
             Uri[] baseAddresses)
    {
        Uri[] newUri;
        if (baseAddresses.Length > 1)
            newUri = new Uri[] { 
             new Uri("http://www.lonetcamp.com/KillBits/Fight.svc")};
        else
        {
            newUri = new Uri[] { baseAddresses[0]};
        }
         return base.CreateServiceHost(serviceType, newUri);
    }
}

Este ejemplo detecta si existe más de una baseAddresss y si es así utiliza el creado especialmente para mi servicio y si solo hay uno utiliza ese “ejemplo mejorable”.

lo único que tenemos que hacer es especificar que el servicio utilice nuestro factoy en vez de el por defecto para que funcione perfectamente la publicación.

<%@ ServiceHost Language="C#" 
Debug="true" 
Service="KillBits.Fight" 
CodeBehind="Fight.svc.cs"
Factory="KillBits.CustomHostFactory" %>

IE7 + Win Vista + TcpIPv6 + Cassini = mal rollo

El otro día le toco a Google y hoy le toca a Microsoft. 

Había visto varios post en los foros de MSDN consultando que se encontraban que con la instalación de VS2008 o VS Express en el sistema operativo Windows Vista y  no podían abrir sus proyectos web con el navegador y el servidor de desarrollo.

Pero como suele pasar creía que eso si ya no me había pasado no me iba a pasar nunca. Pero que iluso, de un día para otro me he encontrado con la desagradable sorpresa que no podía abrir ningún proyecto web con el servidor que viene por defecto con vs2005 “Cassini”

En realidad y como le he tenido que dar muchas vueltas el servidor no se encuentra realmente con los ficheros del VS, sino con los ficheros del Framework 2.0  “c:WindowsMicrosoft.NETFrameworkv2.0.50727WebDev.WebServer.exe”.

 

Pues eso, de un día para otro sin aviso previo no puedo generar ningún proyecto web con este servidor.

 

Porque motivo? Quien sabe, un Services pack, una actualización de seguridad o  un driver.

 

Me he tirado un par de días navegando y probando miles de trucos y finalmente lo único que ha funcionado la desactivación del protocolo TCPipv6 y lo resumiré seguidamente.

 

Desactivar esta opción en windows vista. “RegEdit” –> HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicestcpip6ParametersDisabledComponents   DWORD =  hexadecimal =  0x2A

Para que funcione Firefox:

 

  1. Introducir about:config en la barra de direcciones.
  2. Buscar la propiedad network.dns.disableIpv6
  3. Establecer su valor en true.
  4. Reeiniciar el Navegador.

 

 

Para que funcione en IE7:

 

  1. Modificar el Fichero HOST –>  127.0.0.1  localhost
  2. c:WINDOWSsystem32driversetc
  3. Reiniciar el sistema.

 

 

 

Todo esto esta extraido de http://accidentaltechnologist.com/asp-net/aspnet-development-server-problems-under-vista

Espero que si a alguien le pasa esto, no pierda un par de días como yo!!

Cross-posting: http://lonetcamp.com 

 

 

 

Error al instalar SQL Express en un windows XP SP2

Bueno como no me quiero enrollar y de lo que se trata es de solucionar un problema este es el error: 


WMI Error 2147749907(0x80041013).


Este error me surgió al intentar abrir una base de datos Access y posteriormente  intentar instalar un SQL Express en un Windows XP con SP3 y el Framework 2.0 con el SP1.


 Después de intentar muchisimas sugerencias:


http://blogs.msdn.com/jpapiez/archive/2004/12/09/279041.aspx


http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=193534&SiteID=1


La respuesta para mi problema era mucho más sencillo que todo eso:


 



 


Instalar el Proveedor SNMP WMI. de los componentes de windows.


Con eso la conexión y la instalación del SQL Express funcionó a la primera.


Bueno espero que todo el tiempo que he tenido que perder para poder encontrar esta chorrada de solución sea útil para alguien.


Saludos.


Cross-posting de www.lonetcamp.com