2009-02-03 13 views
8

Tengo un entorno en el que varios sitios alojados en el mismo servidor utilizarán un único servicio para realizar sus llamadas. Por ejemplo:Direcciones base múltiples en el servicio WCF individual

http://domain1.com/Api/Service.svc

http://domain2.com/Api/Service.svc

La aplicación API se ha configurado como un directorio virtual en cada sitio mapeado en el mismo directorio físico, por lo que la fuente sólo se encuentra en un solo lugar. El problema es que a WCF no le gusta tener múltiples direcciones base para sus puntos finales de servicio. Para obtener el servicio para trabajar en absoluto, he tenido que añadir un filtro de dirección de base prefijo:

<serviceHostingEnvironment>  
    <baseAddressPrefixFilters>   
    <add prefix="http://domain1.com/Api" /> 
    <!--<add prefix="http://domain2.com/Api" />--> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Sin embargo esto sólo funciona para domain1, ya que sólo se permite una baseAddressPrefixFilter (que no deberían llamarlo baseAddressPrefixFilter s si solo tiene permitido uno). Intenté crear un ServiceHostFactory personalizado para evitarlo, pero me encuentro con el problema del filtro antes de llamar a ServiceHostFactory en el proceso de Activación.

¿Alguna idea sobre cómo conseguir que un solo servicio funcione en 2 dominios como este?

Respuesta

5

Ok, poner toda la URL en la dirección del punto final era algo en lo que no había pensado, así que eso me está llevando a algún lado. Después de usar el ServiceHostFactory personalizado, eso funcionó para domain1, pero no para domain2. Tengo un nuevo mensaje de error que no he visto antes:

"Sin enlace de protocolo coincide con la dirección que figura 'http://domain2.com/Api/Poll.svc/soap' Enlaces de protocolos se configuran en el nivel del sitio en IIS OR fue de configuración.".

Actualización:

Ok, lo he descubierto (por fin!). Puedo agregar un nodo host a la definición del servicio y evitar el uso de direcciones URL absolutas en cada punto final. También eliminé BaseAddressPrefixFilter, pero mantuve el ServiceHostFactory personalizado en la solución.

<service name="Poll"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://domain1.com/Api"/> 
     <add baseAddress="http://domain2.com/Api"/> 
     </baseAddresses> 
    </host> 
    <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="soapBinding" 
     contract="IPoll" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />   
    </service> 

Estaba preocupado de que iba a tener que escribir un punto final para cada dominio para cada unión, lo que habría sido una gran cantidad de exceso de configuración para administrar. Esta solución es genial porque no tengo que hacer eso, es un poco más conciso.

Como referencia, aquí está mi clase ServiceHostFactory. Es bastante simple, pero es obligatorio. Una vez que tenga esto, también hay que modificar el margen de beneficio de su archivo .svc para incluir la fábrica: Fábrica = "Api.ServiceHostFactory"

public class MyServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    {       
     ServiceHost host; 

     host = new ServiceHost(serviceType, baseAddresses[0]); 

     return host; 
    } 
} 
+0

Bien hecho, si solo MS se hubiera tomado la molestia de documentar esto correctamente. Su respuesta en http://blogs.msdn.com/b/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx simplemente no funcionó en absoluto. –

1

IIRC, puede tienen prefijos diferentes, pero solo uno por protocolo, por lo que podría tener un prefijo tcp, y quizás un prefijo https (necesita verificarlo). Sin embargo, ¿también debería poder dar la dirección completa en el servicio, en lugar de usar la dirección base y la parte relativa? Sin embargo, es posible que necesite múltiples puntos finales.

+1

Marc, ¿cuál es el razonamiento detrás de esta limitación "único prefijo por protocolo" ? –

Cuestiones relacionadas