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 &gt; 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">

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s