Tengo un conjunto de contratos de servicio que dividen mi interfaz de servicio en fragmentos de funcionalidades relacionadas. Actualmente estoy implementando todos los contratos usando una sola clase de servicio (puede dividirlos más adelante, pero por ahora la clase de servicio individual es suficiente).Servicio alojado WCF IIS múltiples contratos de servicio implementados por un solo servicio: cómo comparto uri entre puntos finales a través de config
Estoy tratando de usar la configuración de los puntos finales utilizando un archivo de configuración (a diferencia del código de vía). El problema es que obtengo un ServiceActivationException
porque los dos extremos (uno para cada contrato de servicio) están tratando de escuchar en el mismo uri. Los detalles de la excepción dicen que para lograr esto, los dos puntos finales deben compartir el objeto vinculante, lo cual tiene sentido, pero no puedo entender cómo hacerlo a través de config (no he intentado hacerlo a través del código ya que estoy alojado en IIS pero Puedo imaginarme que es un ejercicio simple de configurar en el código).
La siguiente es la configuración que uso actualmente (esto todavía está dev así que no estoy actualmente preocupados por los problemas de seguridad, etc., que algunos de estos ajustes pueden exponer a):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="CDC.WebPortal.MidTier.MidTierAccessService"
behaviorConfiguration="MidTierServiceBehaviour" >
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.IProductService" />
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.ICategoryService" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="RestBindingConfiguration"
maxReceivedMessageSize="104857600">
<readerQuotas maxStringContentLength="104857600"/>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MidTierServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
Entonces mi pregunta es ¿cómo comparto esta unión entre los dos puntos finales?
Los comentarios en this SO question sugieren que no puedo hacer esto, pero no creo que sea correcto.
ACTUALIZA 1this MS publication De acuerdo con lo que estoy haciendo debe estar bien ...
Update2 Aquí está el contenido del archivo SVC si ayuda:
<%@ ServiceHost Language="VB" Debug="true"
Service="*********************.MidTierAccessService"
Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>
ACTUALIZACIÓN 3 Aquí está el detalle de la excepción:
Un instalador vinculante ce ya se ha asociado para escuchar URI '********************'. Si dos puntos finales desean compartir el mismo ListenUri, también deben compartir la misma instancia de objeto vinculante . Los dos extremos conflictivos se especificaron en AddServiceEndpoint() llamadas, en un archivo de configuración, o una combinación de AddServiceEndpoint() y config.
ACTUALIZACIÓN 4 Ok echaba de menos this antes, indicando "Usted tendrá que utilizar direcciones relativas al exponer más de un punto final para un servicio particular, .svc". La causa de esto es algo relacionado con el directorio virtual de IIS que determina la dirección base del servicio. ¿Alguien puede explicar esto con un poco más de detalle, es decir, por qué IIS necesita un direccionamiento relativo para cada contrato?
+1 para 'verdadera bruja' – dan
@dan: lol: D Gracias. – jrista