.net - collection - configurar web.config wcf
MĂșltiples direcciones base en un solo servicio WCF (2)
IIRC, puede tener prefijos diferentes, pero solo uno por protocolo, para que pueda 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.
Tengo un entorno en el que varios sitios alojados en el mismo servidor usarán un solo servicio para realizar sus llamadas. Por ejemplo:
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 asignado al mismo directorio físico, de modo que la fuente solo se encuentra en un lugar. El problema es que a WCF no le gusta tener múltiples direcciones base para sus puntos finales de servicio. Para que el servicio funcione, tuve que agregar un filtro de prefijo de dirección base:
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://domain1.com/Api" />
<!--<add prefix="http://domain2.com/Api" />-->
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Sin embargo, esto solo funciona para domain1, porque solo se permite un baseAddressPrefixFilter (no deberían llamarlo baseAddressPrefixFilter s si solo se permite 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 hacer que un solo servicio funcione en 2 dominios como este?
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 lleva a algún lado. Después de usar el ServiceHostFactory personalizado, eso funcionó para domain1, pero no para domain2. Recibí un nuevo mensaje de error que no había visto antes:
"Ningún enlace de protocolo coincide con la dirección dada '' http://dominio2.com/Api/Poll.svc/soap ''. Los enlaces de protocolo se configuran en el nivel del Sitio en la configuración IIS o WAS".
Actualizar:
Ok, lo descubrí (¡finalmente!). 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>
Me preocupaba tener que escribir un punto final para cada dominio para cada enlace, lo que hubiera sido una gran cantidad de configuración excesiva 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 debe modificar el marcado de su archivo .svc para incluir Factory: Factory = "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;
}
}