Pregunta

Tengo una aplicación web implementada en un hosting de internet del proveedor.Esta aplicación web consume un Servicio WCF desplegado en un servidor de IIS encuentra en mi empresa, servidor de aplicaciones, con el fin de tener acceso a los datos de la empresa la base de datos, la red de los chicos me permitió exponer este servicio WCF a través de un firewall por razones de seguridad.Un diagrama tendría este aspecto.

[Página hospedada] ---> (Internet) ---> |Firewall <Public IP>:<Port-X >| ---> [IIS con Servicio de WCF <Comp. Network Ip>:<Port-Y>]

También quería utilizar wsHttpBinding para tomar ventaja de sus características de seguridad y cifrar la información sensible.

Después de probarlo me sale el siguiente error:

Detalles De La Excepción:Sistema.ServiceModel.EndpointNotFoundException:El mensaje con A 'http://:/service/WCFService.svc' no puede ser procesado en el receptor, debido a un AddressFilter desajuste en la EndpointDispatcher.Verificar que el remitente y el receptor de la EndpointAddresses de acuerdo.

Hacer un poco de investigación descubrí que wsHttpBinding utiliza WS-Addressing normas, y leer acerca de este estándar aprendí que el encabezado SOAP se ha mejorado para incluir etiquetas como 'Mensaje', 'ReplyTo', 'Acción' y 'A'.

Así que supongo que, debido a la aplicación de cliente de extremo especifica la dirección IP del Firewall y el Puerto, y el servicio responde con su dirección de red interna que es diferente de la del Cortafuegos IP, a continuación, WS-Direccionamiento de incendios en el mensaje anterior.Que creo que es una muy buena medida de seguridad, pero no es muy útil en mi escenario.

Citando el WS-Direccionamiento estándar de presentación (http://www.w3.org/Submission/ws-addressing/)

"Debido a la variedad de tecnologías de red actualmente en uso generalizado (por ejemplo, NAT, DHCP, firewalls), muchas de las implementaciones no puede asignar una significativa de URI global a un punto final determinado.Para permitir que estos "anónimo" extremos para iniciar los modelos de intercambio de mensajes y recibir respuestas, WS-Addressing define los siguientes conocido URI para su uso por las estaciones que no puede tener una estable, se puede resolver con URI. http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"

¿CÓMO puedo configurar mi wsHttpBinding Extremo a la dirección de mi Firewall IP y a ignorar o pasar por alto la dirección especificada en la 'A' WS-Addressing etiqueta en el mensaje SOAP header?O tengo que cambiar algo en mi configuración de extremo de servicio?

Ayuda y orientación será muy apreciada.

Marko.

P. S.:Mientras yo a encontrar alguna solución a esto, estoy usando basicHttpBinding con absolutamente ningún problema de curso.

¿Fue útil?

Solución

Usted puede tratar de decorar su clase de servicio con:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Otros consejos

Una forma más segura de manejar esto es para establecer el punto final ListenUri a la URL de servicio, y el punto final de direcciones para el criterio de valoración externa, donde los clientes envían mensajes. De esta manera el servicio "confía" en los mensajes dirigidos solamente a esa dirección, no sólo CUALQUIER dirección.

No sé acerca de la solución de Mitch Baker, nunca se intentó. Pero se trata de modificar el código generado. Hay otra manera de conseguir alrededor de eso.

Asumo que ha generado el código de cliente utilizando svcutil.exe, dando una dirección de MEX que apunta al servidor de seguridad. Al hacer esto, toda la configuración necesaria se añade a la App.config (o Web.config). Sin embargo, la dirección del servicio en la configuración apuntará a la dirección de servicio real (como en el archivo WSDL la dirección de la solera del servicio sea la dirección del servicio real).

Por lo tanto, lo que creo que va a resolver este problema:

  1. Generar código de cliente dando la dirección MEX (por ejemplo: http: //: Port-X / servicio / wcfservice.svc WSDL?). Esta voluntad generado toda la configuración necesaria.

  2. Cuando se invoca el constructor cliente, dar el URI del servidor de seguridad como el EnpointAddress, y el nombre de la configuración de la configuración generada. De esta manera, el cliente enviará un mensaje como si se enviaba al servicio, pero a la dirección del servidor de seguridad:

    cliente = new ServiceClient (endpointConfigName, nuevo System.ServiceModel.EndpointAddress ( "http: //: Port-X / servicio / wcfservice.svc"));

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top