WCF detrás del equilibrador de carga: cómo configurarlo

Tenemos un par de servidores web que usan el equilibrador de carga. Las máquinas ejecutan IIS6 en el puerto 81. Externamente, el sitio es accesible usando el puerto 80. El nombre externo y el nombre de la máquina son diferentes.

Estaban obteniendo

System.ServiceModel.EndpointNotFoundException: The message with To '' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.

La parte relevante de web.config es:

  

Intentamos agregar listenUri, pero eso no solucionó nuestros problemas.

¿Algunas ideas?

0

2 Respuestas

[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]

Poner este atributo en servicio resuelve el problema.

0
agregado
Aquí se encuentra una discusión más detallada de los problemas stackoverflow.com/questions/274984/…
agregado el autor Richard Collette, fuente

¿Cuál es el equilibrador de carga específico? Al usar un F5 BIG-IP conseguimos que funcionara con bastante facilidad, pero estábamos usando el mismo puerto y el (relativo) uri en el nlb como máquinas individuales (de modo que podemos tratar una máquina individual igual que la granja si elegimos). Obviamente, cada máquina tiene un nombre diferente, pero esta configuración también le permite probar servidores individuales falsificando el host, por ejemplo, editando su archivo HOSTS para apuntar [su nombre de granja] a [IP del servidor de prueba].

El mayor dolor que tuvimos fue SSL; utilizando la seguridad de TransportWithMessageCredential, WCF rechaza las conexiones de HTTP entrantes, por lo que tuvimos que configurar el nlb para volver a encriptar entre el nlb y el nodo del servidor, pero no es un problema.

El único otro problema que teníamos era alojar WCF dentro de IIS, y WCF no podía identificar correctamente el sitio deseado (aunque IIS estaba bien) en lugar de http (pero era correcto sobre https). Para solucionarlo, escribí una fábrica personalizada que simplemente ignoró http por completo (solo se escuchó en https), lo que se relaciona muy bien con los requisitos de TransportWithMessageCredential de todos modos, así que no me molestó esto.

Me pregunto si no obtendrías más placer alojando en un puerto estándar pero como un sitio diferente (IP/host-header/etc).

0
agregado