2012-01-15 11 views
5

Tengo un servicio hospedado IIS7 que necesito exponer a dos clientes diferentes. Para uno de los clientes, necesito aplicar un comportamiento de limitación más estricto que el otro.WCF Implementación de servicio único, Comportamientos múltiples. Posible

Esto significa que necesito definir Dos etiquetas y porque solo se puede hacer referencia a ellas desde una etiqueta, ¿entonces necesito dos de estas también?

He definido el siguiente web.config. El problema es que cuando intento navegar a cualquiera de los servicios para que pueda tirar de los metadatos luego me sale el siguiente error:

Parser Error Message: A child element named 'service' with same key already exists at the same configuration scope. 
Collection elements must be unique within the same configuration scope (e.g. the same application.config file). Duplicate key value: 'WCFTwoEndpoints.Calculate'. 

¿Voy esto de la manera correcta?

<system.serviceModel> 
    <services> 
     <service name="WCFTwoEndpoints.Calculate" behaviorConfiguration ="NotThrottled"> 
     <endpoint address="http://localhost/WCFTwoEndpoints/Calculate.svc" 
      binding="wsHttpBinding" bindingConfiguration="" name="Calculator" 
      contract="WCFTwoEndpoints.ICalculate" /> 
     <endpoint binding="mexHttpBinding" name="mex" contract="IMetadataExchange" /> 
     </service> 
     <service name="WCFTwoEndpoints.Calculate" behaviorConfiguration ="Throttled"> 
     <endpoint address="http://localhost/WCFTwoEndpoints/ThrottledCalculate.svc" 
      binding="wsHttpBinding" bindingConfiguration="" name="ThrottledCalculator" 
      contract="WCFTwoEndpoints.ICalculate" /> 
     <endpoint binding="mexHttpBinding" name="mex" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="NotThrottled"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     <behavior name="Throttled"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceThrottling maxConcurrentCalls="19" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
+0

¿Tiene 2 archivos .SVC diferentes llamados Calculate.svc y ThrottledCalculate.svc – Rajesh

+0

Sí tengo 2 archivos .SVC diferentes, pero ambos apuntan a los mismos .cs –

+0

Supongo que tener el mismo nombre de clase como código subyacente es causando el problema ya que WCF espera que los elementos del Servicio sean únicos y usted tiene 2 elementos de servicio con el mismo nombre. ¿Puede enviar la funcionalidad a una clase base y luego heredar eso en diferentes clases para que los nombres de sus servicios sean únicos? – Rajesh

Respuesta

7

Está un poco trabado, porque el nombre de la clave debe coincidir exactamente con el nombre de su clase de servicio.

La única forma de evitar esto sería crear una nueva clase que herede de WCFTwoEndpoints.Calculate. Entonces tendrías un nombre distinto. Aunque no es muy agradable.

 

Creo que si le preguntas a los diseñadores de WCF por qué lo diseñaron como este, que diría que una serivce se supone que se indepent del cliente. Lo que quiere aquí no es realmente un solo servicio; pero dos servicios independientes diferentes que simplemente tienen alguna implementación en común. Desde el punto de vista de los clientes, no se comportarían como un solo servicio.

Cuestiones relacionadas