2010-05-10 19 views
6

Estoy implementando un servicio web WCF que interactúa con un cliente cuyo código no controlo. El WSDL fue provisto por el cliente.WSDL primer servidor WCF donde el cliente no envía SOAPAction

Genere archivos C# del WSDL usando SvcUtil, y además de los errores discutidos here no tuve problemas.

Después de alojar el servicio en IIS 7.0 con SSL habilitado (requerido por el cliente), intenté que el cliente realizara una solicitud al servicio.

En este punto, tiene el siguiente error:

The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None). 

comprobé que podía usar los metadatos publicado por el servicio junto con SOAPUI para hacer la misma petición. Esto funcionó bien.

Intenté utilizar SOAPUI utilizando WSDL suministrado con el cliente. Esto falló con el mismo error de acción vacío anterior.

Luego conecté Wireshark (habilitando el descifrado SSL) y verifiqué que el mensaje enviado por el cliente carece de SOAPAction, por lo que parece que este es definitivamente el problema.

Como no puedo cambiar al cliente, ¿hay alguna manera de obtener un servicio web de WCF para interactuar con dicho cliente? Supongo que necesitaría aceptar solicitudes sin SOAPAction y, en cambio, derivar la solicitud deseada del tipo de objeto de solicitud en el sobre SOAP.

Respuesta

18

A continuación trabajó para mí (basado en this hilo):

  1. Descargar los ejemplos Microsoft WCF.
  2. Agregar los siguientes archivos a su proyecto de WF_WCF_Samples \ WCF \ extensibilidad \ interoperabilidad \ RouteByBody \ CS \ servicio
    • DispatchByBodyOperationSelector.cs
    • DispatchByBodyBehaviorAttribute.cs
  3. Añadir los siguientes atributos a su interfaz (al lado de su ServiceContract)
    • XmlSerializerFormat
    • DispatchByBodyBehavior
  4. Añadir lo siguiente a su interfaz de servicio

    [OperationContract(Action = "")] 
    public void DoNothing() 
    { 
    } 
    
  5. Para mi servicio y la WrapperName Wrappernamespace son null para todos los mensajes. Tenía que ir a DispatchByBodyBehaviorAttribute y editar ApplyDispatchBehavior() añadir las siguientes líneas para comprobar esto:

    if (qname.IsEmpty) { 
        qname = new XmlQualifiedName(operationDescription.Messages[0].Body.Parts[0].Name, operationDescription.Messages[0].Body.Parts[0].Namespace); 
    } 
    
+0

acertadas! Acabo de pasar unas horas investigando este tema. Estaba tratando de hacer que mi nuevo servicio web WCF se vea idéntico (desde la perspectiva del cliente) a un servicio web más antiguo y realmente se quedó atascado en esto. Tuve que especificar múltiples acciones vacías para que el wsdl coincidiera con la versión anterior, pero esto rompió WCF.Es decir, hasta que encontré tu respuesta que funcionó perfectamente. ¡Si pudiera votarte más de una vez, lo haría! –

+0

Me alegro de poder ayudar. –

+0

En caso de que alguien implemente esta solución, y comience a recibir el error "Este mensaje no puede soportar la operación porque se ha leído" durante la depuración, consulte mi respuesta aquí que podría ayudar: http://stackoverflow.com/a/11170390/ 1373170 –

Cuestiones relacionadas