Escrito en C# de cliente para consumir un servicio web Java que devuelve array de objetos

StackOverflow https://stackoverflow.com/questions/64833

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy escribiendo un cliente de C# que llama a un servicio web escrito en Java (por otra persona).He añadido una referencia web a mi cliente y yo soy capaz de llamar a los métodos del servicio web de aceptar.

El servicio fue cambiado a devolver un array 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 proxy de C# llama al servicio web (usando SoapHttpClientProtocol.Invocar), estoy esperando un MyResponse[] matriz con una longitud de 1, es decir, un solo elemento.Lo estoy consiguiendo, después de la llamada de invocación es un elemento con id=0 y la razón=null, independientemente de lo que el servicio devuelve realmente.El uso de un sniffer de paquetes, puedo ver que el servicio está devolviendo lo que parece ser un legítimo mensaje soap con un id y una razón para valores no nulos.

¿Hay algún truco para conseguir un cliente de C# para llamar a un servicio web Java que devuelve someobject[] ?Voy a trabajar y conseguir un sanitized demo si es necesario.

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

¿Fue útil?

Solución

Ha sido un rato, pero me parece recordar que tiene problemas con las ligeras diferencias en cómo los espacios de nombres por defecto se manejan entre .Net y Java web services.

Verifique que la generada en c# de la clase proxy y cualquier espacio de nombres se declara dentro de (especialmente los valores predeterminados xmlns=""), en contra de lo que el Java service está esperando.Probablemente habrá que ser muy sutiles diferencias que tendrá que volver a crear.

Si este es el caso, entonces usted va a dar más declaraciones de espacio de nombres en c# atributos.

Otros consejos

Gracias a Xian, tengo una solución.

El wsdl para el servicio incluye una línea de

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

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

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

Pero la carga xml de la respuesta (desde el servicio al cliente) ¿ no tener este espacio de nombres incluye.Jugando con la respuesta HTTP (que he obtenido con WireShark), He observado que el .NETO de la clase de proxy correctamente recogido el MyResponse valores si me forzó el atributo xmlns en cada devuelto elemento de datos.

Corto de cambiar el servicio, del que no tengo el control, la solución es editar el VS generado clase de proxy (por ejemplo de Referencia.cs) y buscar líneas como esta:

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

y comentar el atributo XmlType línea.Esto le dirá el CLR para buscar los elementos de respuesta en el espacio de nombres predeterminado, más que el especicado en el wsdl.Tienes que rehacer cada vez que se actualiza la referencia, pero al menos funciona.

Por tu pregunta, parece que tenía el cliente trabajo en un punto y, a continuación, el servicio fue cambiado a devolver una matriz.Asegúrese de volver a generar el proxy de modo que el mensaje SOAP devuelto se deserializa en el cliente.No estaba claro que había hecho esto - simplemente asegurarse de que.

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