none
Erro utilizando dado tipo INT em objetos enviados numa chamada WSDL RRS feed

  • Pergunta

  • Boa tarde.

    Estou com dificuldades para serializar propriedades do tipo INT de objetos que estão em uma chamada para um WSDL.

     

    Contrato:

    using System;
    using System.Collections.Generic;
    using System.Runtime.Serialization;
    
    namespace MeuSistema.Pocket.Contratos
    {
      [DataContract]
      public class PedidoDTO
      {
        [DataMember]
        public Int32 Id { get; set; }
    
        [DataMember]
        public string NumMesa { get; set; }
    
      }
    }
    

     

    A assinatura do meu método é esta abaixo:

    public int EnviaPedido(PedidoDTO ped, int adminId) { ... }
    

     

    Minha chamada:

    PedidoDTO pp = new PedidoDTO();<br/>pp.Id = 100;
    pp.NumMesa = "18";
    
    wsdl.BeginEnviaPedido(
      pp,
      1,
      WSDLRetorno,
      null
    );
    

    Quando envio o objeto populado para meu serviço, todas as propriedades do tipo inteiro simplesmente chegam com valor 0 (zero). Já as propriedades do tipo string chegam com o valor normal.

    Detalhe: Só zera os valores dos inteiros que estão dentro de objetos, PedidoDTO no caso. O valor de adminId recebe normalmente.

    Não cheguei a testar com outros tipos, mas creio que solucionando o INT se resolve dos demais, caso hajam outros.

     

    Alguém já passou por isso e/ou sabe a solução?

     

    Grato!

    quarta-feira, 25 de agosto de 2010 17:22

Respostas

  • Boa tarde Theo,

     

    Acredito que o seu problema seja o seguinte: Quando o wizard da microsoft cria as classes de acesso ao serviço, para alguns campos são criadas duas variáveis.

    Uma variavel com nome correto e do tipo correto, e outra com o nome seguido de Specified do tipo bool. essa nova variavel especifica quando a variavel normal deve ser serializada. Exemplo:

     

    A sua classe PedidoDTO deve ter uma propriedade Id e uma IdSpecified. Mesmo que você atribua um valor a Id, se a propriedade IdSpecified for false, o valor de Id não será serializado e, portanto, chegara como null ou 0 no serviço. Para que o valor chege corretamente até o serviço basta atribuir true ao campo IdSpecified.

     

     

     

     

    • Marcado como Resposta Theo Fernandes quarta-feira, 25 de agosto de 2010 19:51
    quarta-feira, 25 de agosto de 2010 18:59

Todas as Respostas

  • Boa tarde Theo,

     

    Acredito que o seu problema seja o seguinte: Quando o wizard da microsoft cria as classes de acesso ao serviço, para alguns campos são criadas duas variáveis.

    Uma variavel com nome correto e do tipo correto, e outra com o nome seguido de Specified do tipo bool. essa nova variavel especifica quando a variavel normal deve ser serializada. Exemplo:

     

    A sua classe PedidoDTO deve ter uma propriedade Id e uma IdSpecified. Mesmo que você atribua um valor a Id, se a propriedade IdSpecified for false, o valor de Id não será serializado e, portanto, chegara como null ou 0 no serviço. Para que o valor chege corretamente até o serviço basta atribuir true ao campo IdSpecified.

     

     

     

     

    • Marcado como Resposta Theo Fernandes quarta-feira, 25 de agosto de 2010 19:51
    quarta-feira, 25 de agosto de 2010 18:59
  • Era isso mesmo, Leandro. Muito obrigado.

     

    Para não ter que alterar no Reference.cs toda vez que dar update no serviço, pode-se definir no contrato desta forma:

    [DataMember(IsRequired=true)]
    

     

    Mais uma vez, muito obrigado!

     

     

    quarta-feira, 25 de agosto de 2010 20:05