1
resposta

Problemas com namespace ao consumir

Estou com uma situação em que preciso fazer uma engenharia reversa, pois a máquina que consome o meu serviço é inalterável então preciso preparar o meu serviço para ler o xml que já está pronto. O problema é que a tag que corresponde ao método contém um namespace :

<ns2095:login4 xmlns:ns2095="http://tempuri.org">

Com isso eu resolvi o problema adicionando o namespace ao meu service contract:

[ServiceContract(Namespace = "http://tempuri.org")]

O problema é que a tag filha que corresponde ao parâmetro a ser recebido pelo serviço não tem o namespace no xml:

<__numeric_0>

O que acontece é que o objeto é recebido null e só consegui resolver se eu adiconar o namespace na tag do xml também:

<ns2095:__numeric_0>

Porém eu não tenho como mudar o xml, então tentei definir no DataContract para ignorar o namespace, mas não funcionou:

[DataContract(Namespace = "", Name = "__numeric_0")]

Código completo:

Xml enviado ao serviço:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <SOAP-ENV:Body>
        <ns2095:login4 xmlns:ns2095="http://tempuri.org">
             <__numeric_0>        
        ...
             </__numeric_0>
         </ns2095:login4>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Service Contract:

    [ServiceContract(Namespace = "http://tempuri.org")]
    public interface ISimulador
    {
        [OperationContract(Name = "login4")]
        LoginResponse SolicitarLogin(LoginRequest __numeric_0);
    }

Data Contract:

    [DataContract(Namespace = "", Name = "__numeric_0")]
    [KnownType(typeof(LoginRequest))]
    [KnownType(typeof(SimInfo))]
    public class LoginRequest
    {
    }

Teria uma forma de configurar para o serviço ignorar este namespace no <__numeric_0>?

1 resposta

Olá, Bruno!

Você pode baixar o Web Service Studio (https://webservicestudio.codeplex.com/), apontar para o endereço do serviço e entra na aba "WSDLs & Proxy" para ver o código .NET do proxy que ele gera. Imagino que deva conter as anotações (atributos) corretos para funcionar com o seu web service.