none
WCF altera os objetos de forma indesejada RRS feed

  • Pergunta

  • Bom dia

     

    Criei um serviço WCF, algumas classes e métodos no WCF que retornam essas classes.

     

    Porém, uma prática que adotamos aqui é inicializar todas as variáveis da classe.

    Exemplo: se eu tenho uma classe Pessoa, ela fica assim:

     

    public class Pessoa
    {
      private int _ID = int.MinValue;
      private string _nome = string.Empty;
    
      public int ID
      {
         get { return _ID; }
         set { _ID = value; }
      }
    }
    .......
    

     

    Só que quando o WCF me retorna um objeto Pessoa, ele irá automaticamente alterar o valor do int para 0, string para null e assim por diante.

     

    Como faço para isso não acontecer?

     

    É alguma configuração de soap? Qual?

     

    Agradeço a ajuda

     

    sexta-feira, 8 de abril de 2011 12:26

Respostas

  • Israel

     

    Eu resolvi criar um teste à parte também e o mais ridículo é que meu teste funcionou perfeitamente.

     

    Já no ambiente de produção, estou tendo estes problemas.

     

    Deve ser algum outro detalhe que passou despercebido.

     

    Mesmo assim, agradeço a ajuda

    • Marcado como Resposta Rafaselic quinta-feira, 14 de abril de 2011 13:05
    quinta-feira, 14 de abril de 2011 13:05

Todas as Respostas

  • Boas Rafaselic,

    Não sei o que está fazendo no seu contrato e implementação, mas isso retorna como você espera:

    interface IContrato
    {
        [OperationContract]
        Pessoa Ping();
    }

    class Servico : IContrato
    {
        public Pessoa Ping()
        {
            return new Pessoa();
        }
    }
    http://www.israelaece.com
    sábado, 9 de abril de 2011 02:14
    Moderador
  • Israel

     

    As classes de retorno do meu WCF estão separadas em uma class library, para respeitar o padrão de camadas.

    Mas o que não entendo é porque ele altera os valores das propriedades de um objeto.

     

    exemplo: se a classe possui uma propriedade numérica, int, quando instancio, o valor é int.MinValue.

    Quando o WCF retorna a classe para o cliente do serviço, esse int será alterado pelo WCF para 0.

    Porquê?

    segunda-feira, 11 de abril de 2011 13:43
  • Boas Rafaselic,

    Você poderia compartilhar o código que está utilizando e em que momento você detecta isso?
    http://www.israelaece.com
    terça-feira, 12 de abril de 2011 10:55
    Moderador
  • Ok Israel

     

    Meu código da classe está em uma DLL e é este:

     

     public class MDLUsuario
     {
      #region Constructors
    
      /// <summary>
      /// Construtor padrao da classe
      /// </summary>
    
      public MDLUsuario() { }
    
      #endregion
    
      #region Members
    
      private long _codUsuario = long.MinValue;
      private long _codSituacaoUsuario = long.MinValue;
      private long _codTipoUsuario = long.MinValue;
      private string _login = string.Empty;
      private string _senha = string.Empty;
      private bool _conectado = false;
      private string _maquinaConectada = string.Empty;
      private DateTime _ultimoAcesso = DateTime.MinValue;
      private DateTime _ultimaTrocaSenha = DateTime.MinValue;
    
      #endregion
    
      #region Properties
    
      [FieldDataColumn("CodUsuario")]
      public long CodUsuario
      {
       get { return _codUsuario; }
       set { _codUsuario = value; }
      }
    
      [FieldDataColumn("CodSituacaoUsuario")]
      public long CodSituacaoUsuario
      {
       get { return _codSituacaoUsuario; }
       set { _codSituacaoUsuario = value; }
      }
    
      [FieldDataColumn("CodTipoUsuario")]
      public long CodTipoUsuario
      {
       get { return _codTipoUsuario; }
       set { _codTipoUsuario = value; }
      }
    
      [FieldDataColumn("Login")]
      public string Login
      {
       get { return _login; }
       set { _login = value; }
      }
    
      [FieldDataColumn("Senha")]
      public string Senha
      {
       get { return _senha; }
       set { _senha = value; }
      }
    
      [FieldDataColumn("Conectado")]
      public bool Conectado
      {
       get { return _conectado; }
       set { _conectado = value; }
      }
    
      [FieldDataColumn("MaquinaConectada")]
      public string MaquinaConectada
      {
       get { return _maquinaConectada; }
       set { _maquinaConectada = value; }
      }
    
      [FieldDataColumn("UltimoAcesso")]
      public DateTime UltimoAcesso
      {
       get { return _ultimoAcesso; }
       set { _ultimoAcesso = value; }
      }
    
      [FieldDataColumn("UltimaTrocaSenha")]
      public DateTime UltimaTrocaSenha
      {
       get { return _ultimaTrocaSenha; }
       set { _ultimaTrocaSenha = value; }
      }
    
      #endregion
     }
    

     

     

    No WCF, eu referencio esta DLL, e crio um método retornando um objeto desta classe.

     

    Assim:

     

    [ServiceContract()]
     public interface IWCF {
       MDLUsuario ConsultarUsuario(long codUsuario);
     }
    
    
    
    [DataContract]
     public class WCF: IWCF {
       public MDLUsuario ConsultarUsuario(long codUsuario)
       {
         //Aqui eu consulto e retorno resultado,
         //utilizando outra DLL responsável por isto.
       }
     }
    

     

     

    Quando uso o WCF no meu projeto WebSite, ele retorna o usuário, mas os campos nulos, deveriam estar : long.MinValue , int.MinValue, etc.

    Porém, o WCF altera para 0 quando são numéricos e null para string.

     

    Pode testar, criando uma DLL separada, um WCF e um cliente deste WCF.

     

     


    quarta-feira, 13 de abril de 2011 13:46
  • Estou usando a versão 4.0 e o VS2010.
    quarta-feira, 13 de abril de 2011 13:51
  • Boas Rafael,

    Refiz aqui para testar:

    using System;
    using System.ServiceModel;

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (ServiceHost host = new ServiceHost(typeof(WCF), new Uri("http://localhost:8281")))
                {
                    host.AddServiceEndpoint(typeof(IWCF), new BasicHttpBinding(), "srv");
                    host.Open();

                    using (ChannelFactory<IWCF> f = new ChannelFactory<IWCF>(new BasicHttpBinding(), "http://localhost:8281/srv"))
                    {
                        MDLUsuario u = f.CreateChannel().ConsultarUsuario(1291);

                        Console.WriteLine("CodUsuario: {0}", u.CodUsuario);
                        Console.WriteLine("CodTipoUsuario: {0}", u.CodTipoUsuario);
                        Console.WriteLine("CodSituacaoUsuario: {0}", u.CodSituacaoUsuario);
                        Console.WriteLine("UltimoAcesso: {0}", u.UltimoAcesso);
                    }
                }
            }
        }

        [ServiceContract]
        public interface IWCF
        {
            [OperationContract]
            MDLUsuario ConsultarUsuario(long codUsuario);
        }

        public class WCF : IWCF
        {
            public MDLUsuario ConsultarUsuario(long codUsuario)
            {
                return new MDLUsuario() { CodUsuario = codUsuario };
            }
        }

        public class MDLUsuario
        {
            public MDLUsuario() { }

            private long _codUsuario = long.MinValue;
            private long _codSituacaoUsuario = long.MinValue;
            private long _codTipoUsuario = long.MinValue;
            private string _login = string.Empty;
            private string _senha = string.Empty;
            private bool _conectado = false;
            private string _maquinaConectada = string.Empty;
            private DateTime _ultimoAcesso = DateTime.MinValue;
            private DateTime _ultimaTrocaSenha = DateTime.MinValue;

            public long CodUsuario
            {
                get { return _codUsuario; }
                set { _codUsuario = value; }
            }

            public long CodSituacaoUsuario
            {
                get { return _codSituacaoUsuario; }
                set { _codSituacaoUsuario = value; }
            }

            public long CodTipoUsuario
            {
                get { return _codTipoUsuario; }
                set { _codTipoUsuario = value; }
            }

            public string Login
            {
                get { return _login; }
                set { _login = value; }
            }

            public string Senha
            {
                get { return _senha; }
                set { _senha = value; }
            }

            public bool Conectado
            {
                get { return _conectado; }
                set { _conectado = value; }
            }

            public string MaquinaConectada
            {
                get { return _maquinaConectada; }
                set { _maquinaConectada = value; }
            }

            public DateTime UltimoAcesso
            {
                get { return _ultimoAcesso; }
                set { _ultimoAcesso = value; }
            }

            public DateTime UltimaTrocaSenha
            {
                get { return _ultimaTrocaSenha; }
                set { _ultimaTrocaSenha = value; }
            }
        }
    }

    E o resultado foi:

    CodUsuario: 1291
    CodTipoUsuario: -9223372036854775808
    CodSituacaoUsuario: -9223372036854775808
    UltimoAcesso: 01/01/0001 00:00:00


    http://www.israelaece.com
    quinta-feira, 14 de abril de 2011 11:11
    Moderador
  • Israel

     

    Eu resolvi criar um teste à parte também e o mais ridículo é que meu teste funcionou perfeitamente.

     

    Já no ambiente de produção, estou tendo estes problemas.

     

    Deve ser algum outro detalhe que passou despercebido.

     

    Mesmo assim, agradeço a ajuda

    • Marcado como Resposta Rafaselic quinta-feira, 14 de abril de 2011 13:05
    quinta-feira, 14 de abril de 2011 13:05