2009-03-13 34 views
20

Me he encontrado con un problema al llamar al servicio web en un bus SAP PI desde mi cliente WCF. La operación se define como unidireccional, y el método en mi contrato de operación de proxy está decorado en consecuencia cuando se agrega la referencia de servicio. Sin embargo, el cliente de servicio se pone una excepción cuando se llama a la operación de acuerdo:Problema con el cliente WCF llamando a la operación unidireccional

La operación unidireccional devuelve un mensaje no nulo con la Acción = ''

Usando SoapUI, el método de la El bus se puede llamar con éxito y devuelve un sobre SOAP con un cuerpo vacío. La gente de autobús me dijeron, esto es de acuerdo a las especificaciones SOAP:


(especificaciones de SOAP, capítulo 4.7.9, las operaciones unidireccionales):

Hay diferentes interpretaciones de cómo es ser HTTP utilizado cuando se realizan operaciones de una sola vía.

R2714 Para operaciones unidireccionales, una INSTANCIA NO DEBE devolver una respuesta HTTP que contenga un sobre. Específicamente, la entidad de respuesta HTTP-cuerpo debe estar vacía.

R2750 UN CONSUMIDOR DEBE ignorar un sobre transportado en un mensaje de respuesta HTTP en una operación unidireccional.

R2727 Para las operaciones de un solo sentido, un consumidor no tiene que interpretar un código de estado de respuesta HTTP con éxito (es decir, 2xx) en el sentido de que el mensaje es válida o que el receptor de la procesaría.


Parece que mi cliente WCF no cumple con R2750.

He descubierto que cuando forzo el contrato de operación en el proxy sea IsOneWay = falso, todo funciona.

¿Hay algún problema con la forma en que WCF maneja las operaciones unidireccionales o hago algo incorrecto (más probable)? ¿Hay algo más que deba hacer, simplemente no parece correcto anular el cliente de proxy WCF generado.

Gracias por cualquier sugerencia.

+2

Gran pregunta +1. Yo diría que su lado no cumple con R2714 tampoco. Considere presentar un incidente con Microsoft y dejarnos saber cuál es el resultado. –

+0

Pregunta similar (y más información): http://stackoverflow.com/q/4510484/46039 –

+0

Enlace a la especificación SOAP 4.7.9 Operaciones unidireccionales: http://www.ws-i.org/profiles/basicprofile -1.1.html –

Respuesta

11

Parece que SAP PI envía incorrectamente un sobre de SOAP vacío y .NET lo interpreta incorrectamente.

Algunas opciones de this thread:

  • alterar el proxy generado y eliminar OneWay = true (o añadir OneWay = false) para la definición del método
  • captura la Violación Protocolo en un manejador de excepciones e ignorarlo
  • utilizan un estilo webreference 2.0 para llamar al servicio
  • aplican SAP parche Note 1459995 - Soap Sender Adapter HTTP 202 y añadir & responsecode202 = true a la url

La primera y la última opción me funcionaron. Más discusión sobre este sap.com thread.

+0

Gracias por esto, sigue siendo relevante para mí. –

+0

¡Esta es la respuesta, gracias por la ayuda! – SDeezy

+0

Creo que desde la perspectiva del sistema, una llamada al servicio web siempre debe responder con una confirmación. Verdadero o falso, 1 o 0 para indicar que su mensaje fue recibido y procesado desde el otro lado. –

4

Echaré un vistazo a este artículo también por Gerben van Loon here. Una forma de operación puede no ser una sola de acuerdo con los estándares.

+0

Gracias por este enlace –

+1

La semántica de las llamadas web de una vía sobre 'SOAP' es comparable a' void() 'no fire-and forget. Al igual que un método que devuelve 'void()', la invocación está bloqueando y tiene la capacidad de "devolver" una excepción. –

0

Creo que este problema particular puede ser fijado por la adición de la siguiente declaración de atributo de la operación en el porxy cliente:

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

+0

Gracias por su respuesta. Sin embargo, agregar esto al proxy del cliente generado es casi lo mismo que establecer la propiedad OneWay en falso. Y lamentablemente no funcionó. –

0

Sin ver lo que la firma del método se parece, mi mejor conjetura es ese su método definido para devolver algo que no sea "vacío". Como la operación es unidireccional, el método solo puede definirse usando "void" (no tiene retorno). Cualquier otra cosa, y la operación NO es unidireccional.

+0

El método realmente devuelve vacío –

1

Marque esta SAP hilo hacia afuera para la discusión completa: http://scn.sap.com/thread/1627368

@ Brian Low ha respondido a esta pregunta correctamente y muy a fondo (se debe conseguir marcado como la respuesta).

También me gustaría agregar que este es un error conocido en el que el Adaptador SOAP no cumple con el WS-I Basic Profile 1.1 mencionado anteriormente (R2750) y WCF no cumple con (R2750). El resultado ... Horas de tiempo perdido y dientes rechinando ....

Cuestiones relacionadas