Escrito C# cliente para consumir o Java web service que retorna a matriz de objetos de

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu estou escrevendo um C# cliente que chama um serviço da web, escrito em Java (por outra pessoa).Eu adicionei uma referência da web para o meu cliente e eu sou capaz de chamar métodos do serviço web ok.

O serviço foi alterado para retornar um array de objetos, e o cliente não analisa corretamente os retornado mensagem SOAP.

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}

Quando o meu C# gerada proxy chama o serviço da web (usando SoapHttpClientProtocol.Invocar), estou à espera de um MyResponse[] array com comprimento de 1, ou seja, um único elemento.O que eu estou chegando depois de Invocar a chamada é um elemento com id=0 e razão=nulo, independentemente do que o serviço, na verdade, retorna.Com um packet sniffer, eu posso ver que o serviço está a devolver o que parece ser um legítimo mensagem soap com o id e a razão definida para valores não nulos.

Existe algum truque para obter um C# cliente para chamar o Java web service que retorna someobject[] ?Eu vou trabalhar na obtenção de um higienizado demo, se necessário.

Editar:Esta é uma referência da web através de "Add Web Reference...".VS 2005, .NET 3.0.

Foi útil?

Solução

Tem sido um tempo, mas eu me lembro de ter problemas com pequenas diferenças na forma como padrão namespaces foram tratados entre .Net e Java web services.

Verifique a c# gerada classe proxy e quaisquer espaços de nomes declarados dentro (especialmente os padrões xmlns=""), contra a qual o serviço Java está esperando.Haverá, provavelmente, ser muito sutis diferenças de que você terá que recriar.

Se este for o caso, então você vai para fornecer mais declarações de espaço de nomes na pasta c# atributos.

Outras dicas

Graças a Xian, eu tenho uma solução.

O wsdl para o serviço incluiu uma linha de

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

O sabão que o cliente enviou para o servidor tinha o seguinte atributo em todos os elementos de dados:

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

Mas a carga xml de resposta (a partir do serviço para o cliente) fez não ter este espaço de nomes incluídos.Por mexer com a resposta HTTP (que eu obtida com WireShark), Tenho observado que o .NET classe de proxy corretamente pegou o MyResponse valores se eu forcei o atributo xmlns em cada devolvidos elemento de dados.

Curto de mudar o serviço, que eu não controlo, a solução é editar o VS classe proxy gerado (por exemplo, de Referência.cs) e olhar para linhas como esta:

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

e comentar o XmlType atributo linha.Isto irá dizer-CLR para olhar para resposta de elementos no espaço de nomes predefinido em vez do que o especicado no wsdl.Você tem que refazer isso sempre que você atualizar a referência, mas pelo menos funciona.

A partir de sua pergunta, parece que você teve o trabalho cliente em um ponto e, em seguida, o serviço foi alterado para retornar uma matriz.Certifique-se de que você re-gerar o proxy para o retornado mensagem SOAP é anular a serialização no cliente.Não era claro que você tinha feito isso - apenas certificando-se.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top