wcf wsdl reverse-proxy

WCF Webservice detrás del proxy inverso público



wsdl reverse-proxy (3)

¿Cómo puedo servir correctamente WSDL de un servicio web WCF ubicado en una LAN privada desde detrás de un proxy inverso escuchando en IP pública?

Tengo un servidor web Apache configurado en modo de proxy inverso que escucha las solicitudes en una dirección IP pública y las atiende desde el host IIS interno. El servicio web WCF genera WSDL utilizando la dirección FQDN del host LAN que, por supuesto, no puede ser leída por un cliente del servicio web de Internet.

¿Hay alguna configuración que pueda configurarse en el web.config de la aplicación wcf o en IIS para personalizar el WSDL generado que contiene la dirección de host y poner una dirección pública en su lugar?




A su clase de servicio agregue el atributo:

<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>

Esto permite que el servicio sea atendido por el cliente como https: // ... pero el servicio se hospede en http: // ..... Consulte esta respuesta para saber cómo crear una extensión para permitir que AddressFilterMode.Any sea especificado a través de la configuración sin requerir atributos de código.

En el web.config del host de servicio, el elemento de punto final debe tener una URL absoluta en el atributo de dirección que es la URL pública que usará el cliente. En el mismo elemento de punto final, establezca el atributo listenUri en la URL absoluta en la que el servidor de servicio está escuchando. La forma en que determino cuál es el URI absoluto predeterminado que está escuchando el host es agregar una referencia de servicio en una aplicación cliente que apunta al servidor físico donde se aloja el servicio. El web.config del cliente tendrá una dirección para el servicio. Luego copio eso en el atributo listenUri en los hosts web.config.

En su configuración de comportamiento de servicio, agregue el elemento serviceMetaData con el atributo httpGetEnabled = true

Entonces tendrás algo como:

<serviceBehaviors> <behavior name="myBehavior"> <serviceMetadata httpGetEnabled="true" /> </behavior </serviceBehaviors> ... <services> <service name="NamespaceQualifiedServiceClass" behavior="myBehavior" > <endpoint address="https://www.sslloadbalancer.com" binding="someBinding" contract="IMyServiceInterface" listenUri="http://www.servicehost.com" ... /> </service> </services>

No estoy seguro si esto funciona con seguridad de mensajes o seguridad de transporte. Para esta aplicación en particular, las credenciales se pasaron como parte del DataContract, por lo que tuvimos basicHttpBinding security mode = none. Como el transporte es seguro (para el equilibrador de carga ssl) no hubo problemas de seguridad.

También es posible dejar en blanco el atributo listenUri, sin embargo, debe estar presente.

Desafortunadamente, hay un error en WCF donde la dirección base de los esquemas importados en el WSDL tiene la dirección base listenUri en lugar de la dirección base pública (la que se configuró utilizando el atributo de dirección del punto final). Para evitar este problema, debe crear una implementación IWsdlExportExtension que traiga los esquemas importados al documento WSDL directamente y elimine las importaciones. Un ejemplo de esto se proporciona aquí http://winterdom.com/2006/10/inlinexsdinwsdlwithwcf . Además, puede tener la clase de ejemplo heredada de BehaviorExtensionElement y completar los dos nuevos métodos con:

Public Overrides ReadOnly Property BehaviorType() As System.Type Get Return GetType(InlineXsdInWsdlBehavior) End Get End Property Protected Overrides Function CreateBehavior() As Object Return New InlineXsdInWsdlBehavior() End Function

Esto le permitirá agregar un comportamiento de extensión en el archivo .config y agregar el comportamiento usando la configuración en lugar de tener que crear una fábrica de servicios.

en el elemento de configuración system.servicemodel add:

<endpointBehaviors> <behavior name="SSLLoadBalancerBehavior"> <flattenXsdImports/> </behavior> </endpointBehaviors> </behaviors> <extensions> <behaviorExtensions> <!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1--> <add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </behaviorExtensions> </extensions>

Y luego haga referencia al nuevo comportamiento del punto final en la configuración de su endpoint utilizando el atributo behaviorConfiguration

<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">