2008-09-15 15 views
10

Estoy escribiendo un cliente C# que llama a un servicio web escrito en Java (por otra persona). He agregado una referencia web a mi cliente y puedo llamar a los métodos en el servicio web.Escribiendo un cliente C# para consumir un servicio web Java que devuelve una matriz de objetos

El servicio se cambió para devolver una matriz de objetos y el cliente no analiza correctamente el mensaje SOAP devuelto.

MyResponse[] MyFunc(string p) 

class MyResponse 
{ 
    long id; 
    string reason; 
} 

Cuando mi generado C# proxy de llama al servicio web (usando SoapHttpClientProtocol.Invoke), estoy esperando a [] array MyResponse con longitud de 1, es decir, un solo elemento. Lo que obtengo después de invocar Invoke es un elemento con id = 0 y reason = null, independientemente de lo que el servicio realmente devuelva. Utilizando un rastreador de paquetes, puedo ver que el servicio está devolviendo lo que parece ser un mensaje legítimo de jabón con id y razón establecida en valores no nulos.

¿Hay algún truco para hacer que un cliente C# llame a un servicio web Java que devuelve someobject []? Trabajaré para obtener una demostración desinfectada si es necesario.

Editar: Esta es una referencia web a través de "Agregar referencia web ...". VS 2005, .NET 3.0.

+0

¿Está utilizando "Agregar referencia web" (.NET 2.0) o "Agregar referencia de servicio" (.NET 3.0)? –

Respuesta

3

Ha pasado un tiempo, pero parece recordar haber tenido problemas con las pequeñas diferencias en cómo se manejan los espacios de nombres predeterminados entre los servicios web .Net y Java.

Comprueba nuevamente la clase proxy C# generada y los espacios de nombres declarados dentro (especialmente los valores por defecto xmlns = ""), con respecto a lo que espera el servicio Java. Probablemente habrá diferencias muy sutiles que deberá recrear.

Si este es el caso, entonces proporcionará más declaraciones de espacio de nombres en los atributos C#.

0

De su pregunta, parece que tenía el cliente trabajando en un punto, y luego el servicio se cambió para devolver una matriz. Asegúrese de volver a generar el proxy para que el mensaje SOAP devuelto se deserialice en el cliente. No estaba claro que hubieras hecho esto, solo asegúrate.

+0

Tu comprensión es correcta. Funcionó hasta que agregué el método que devolvió MyResponse []. Actualicé la referencia y el proxy fue reconstruido. –

8

Gracias a Xian, tengo una solución.

el WSDL para el servicio incluye una línea

<import namespace="http://mynamespace.company.com"/> 

El jabón que el cliente envía al servidor tenía la siguiente atributo en todos los elementos de datos:

xmlns="http://mynamespace.company.com" 

Pero la carga XML de la la respuesta (desde el servicio de vuelta al cliente) hizo no tienen este espacio de nombres incluido. Al retocar la respuesta HTTP (que obtuve con WireShark), observé que la clase de proxy .NET recogía correctamente los valores de MyResponse si forzaba el atributo xmlns en cada elemento de datos devuelto.

menos que cambiar el servicio, que no controlo, la solución es editar el VS genera clase de proxy (por ejemplo Reference.cs) y buscar líneas de este tipo:

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mynamespace.company.com")] 
public partial class MyResponse { 

y comentar la línea de atributo XmlType. Esto le indicará al CLR que busque elementos de respuesta en el espacio de nombre predeterminado en lugar del que se especificó en el wsdl.Tienes que volver a hacer esto cada vez que actualices la referencia, pero al menos funciona.

+0

¡Gracias por publicar su solución, ha traído una avalancha de recuerdos! – Xian

Cuestiones relacionadas