2009-03-26 19 views
5

Todavía estoy aprendiendo toda la cosa de WCF, así que por favor tengan paciencia conmigo aquí.Cómo consumir múltiples servicios WCF de un cliente

Lo que tengo son dos servicios autohospedados creados usando C# y VS 2008:
Servicio # 1 Agrega dos números y devuelve el resultado.
Servicio n. ° 2 Devuelve el cuadrado de un número.

Quiero que el cliente pueda enviar dos números al Servicio 1, obtener la suma y luego enviar la suma al Servicio 2 y obtener el cuadrado.

Tengo dos proxies generados para ambos servicios, y puedo usar Intellisense en ellos, así que esa parte supuestamente funciona.

¿Cómo configuro mi archivo app.config de modo que pueda comunicarme con ambos servicios? En este momento, recibo una excepción cada vez que trato de hacer eso.

[El cliente funciona bien si sólo tengo una de las configuraciones en el archivo de aplicación a la vez, y tratar de llamar sólo a ese servidor.]

supongo que esto es una pregunta muy noobish, y la respuesta probablemente es "estructurar el archivo de configuración en _____ manera", pero Google simplemente no parece tener un ejemplo/guía.

¿Alguien sabe cómo hacer esto?

Nota: Consume multiple WCF services from one client cliente Aunque suena como un duplicado NO es lo que estoy buscando.

Editar: Gracias a marc_s, lo tengo trabajo

tanto con los servicios que se ejecutan en diferentes aplicaciones, no tenía necesidad de dividir el archivo de configuración del servidor, pero aquí es lo que hice con la configuración del cliente archivos: en primer lugar generada automáticamente los archivos de configuración utilizando SvrUtil.exe y luego se fusionó de esta manera:

<bindings> 
    <wsHttpBinding> 

    <binding> 
    ... 
    </binding> 

    <binding> 
    ... 
    </binding> 

    </wsHttpBinding> 
</bindings> 

...

<endpoint> 

...

+0

1 - votada hasta que golpee desde 1999 a 2K representante por lo que ahora puede editar las respuestas de otras personas! ¡Woot! –

+0

@Jeremy: ¡Jaja gracias! Es increíble cuánto tiempo estuvo atascado en 1999. – Mostlyharmless

Respuesta

3

Si desea ejecutar los dos servicios en los puntos finales/puertos separados, hacer algo como esto:

del lado del servidor:

<service name="Service1"> 
    <endpoint address="http://localhost:8001/service1.asmx" 
      binding="basicHttpBinding" 
      contract="IService1" /> 
</service> 
<service name="Service2"> 
    <endpoint address="http://localhost:8002/service2.asmx" 
      binding="basicHttpBinding" 
      contract="IService2" /> 
</service> 

-lado del cliente:

<client> 
    <endpoint address="http://localhost:8001/service1.asmx" 
      binding="basicHttpBinding" 
      contract="IService1" 
      name="Service1" /> 
    <endpoint address="http://localhost:8002/service2.asmx" 
      binding="basicHttpBinding" 
      contract="IService2" 
      name="Service2" /> 
</client> 

Eso debería darle dos puntos finales separados e individuales en el servidor y un cliente que hablará con ambos.

Marc

+0

¡Gracias, eso funcionó! Hubo tantas permutaciones para fusionar los archivos de configuración, que simplemente decidí preguntar, en lugar de cubrir todas las permutaciones: P – Mostlyharmless

0

haces que un choque de criterios de valoración? Asegúrese de que ambos servicios no estén configurados para escuchar en el mismo número de puerto, por ejemplo. Si pudieras publicar tu archivo de configuración (o una versión desinfectada de él), eso ayudaría.

+0

Los tengo funcionando en el mismo puerto, pero puedo llamar al servicio A desde el Servicio B, ambos escuchando el puerto 8000. Supongamos que los ejecuto en diferentes puertos, ¿Cómo estructurar la aplicación.config? – Mostlyharmless

+0

En tendría múltiples elementos , y así sucesivamente. No puedes simplemente copiar ambas secciones completas de configuración, tienes que fusionarlas. –

3

Me doy cuenta de que ha pedido una respuesta de App.Config, pero imagine que esto podría ayudar. Normalmente comenzaría configurando primero las conexiones del cliente programáticamente, ya que es más simple, y una vez que haya funcionado, podría moverlo a su App.Config.

Aquí hay un ejemplo de cómo configurar un cliente WCF.

BasicHttpBinding binding = new BasicHttpBinding(); 
EndpointAddress address = new EndpointAddress(serverURL); 
MyServiceClient myServiceProxy = new MyServiceClient(binding, address); 

En la App.Config, puede encontrar algo como lo siguiente.

<client> 
    <endpoint address="http://localhost/service1.asmx" 
      binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding" 
      contract="IService1" 
      name="Service1" /> 
    <endpoint address="http://localhost/service2.asmx" 
      binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding" 
      contract="IService2" 
      name="Service2" /> 
</client> 
Cuestiones relacionadas