none
Mesmo Objeto vindo de webservices diferentes RRS feed

  • Pergunta

  • Pessoal, estou com uma dúvida cruel aqui.

    Eu desejo trazer um mesmo objeto de webservices diferentes, mas não consigo passar um para o outro. Exemplo:
    possuo
    SG.WsProcesso.Processo processo

    E o
    SG.WsOficio.Processo oficioProcesso



    o objeto oficio contém o objeto processo, mas eu não consigo trazer um um objeto processo diretamente para o objeto ofícioProcesso.

    Eu sei que isso ocorre porque o Visual studio entende os objetos de forma diferente quando vem de webservices diferentes.

    tem como fazer um Cast direto do objeto algo do tipo:

    oficioProcesso = processo; ? ou vcs conhecem uma função que possa mapear os objetos sem que eu ter q fazer um cast campo a campo do objeto?

    existe "oficio.Processo" caso deseje.

    Sds.
    João Pires
    quarta-feira, 17 de dezembro de 2008 15:25

Todas as Respostas

  • Prezado João,

    O que ocorre é que o Visual Studio gera código para esses objetos de acordo com o retorno do webservice descrito no WSDL. Portanto se são 2 webservices diferentes, você terá 2 objetos diferentes.

    Uma solução é colocar os 2 WebMethods no mesmo WebService.

    O que recomendo mesmo é que uma vez q você recebeu o retorno desses webservices, transforme esse objeto para um obejto do seu modelo de domínio e trabalhe com ele.

    Att.,
    André Azevedo
    quarta-feira, 17 de dezembro de 2008 18:28
  • André,
    A questão é que eu não posso fazer isso, pela modelagem que usam aqui, cada objeto de negócio vem de um webservice, quando um objeto tem outro objeto ou herda outro qualquer isso acontece dentro da solução servidor ou livraria de classes contida no servidor.

    Dessa forma os objetos ficam separados por regra de negócio, uma espécie de conteiner de objetos que o torna mais robusto. Quando estou no cliente (no website) eu apenas recebo a lista de webservices e seus métodos e tenho que me virar com eles, os objetos do modelo que consigo ver são apenas os do webservice, fico meio que travado nele.

    Eu uso o Visual Studio 2008 Team System aqui na empresa e acredito que ele deve permitir um meio de que eu possa receber um objeto do tipo "Consultor.Pessoa = pessoa;", mas isso no website, dá pra fazer isso no server, mas eu preciso no cliente que no caso ficaria:

    SG.WsConsultor.Pessoa consultor = new SG.WsConsultor.Pessoa();

    //eu queria poder fazer isso, mas não posso
    consultor.Pessoa = SG.PessoaSG.ConsultarPorCodigo(idPessoa); //retorna um objeto SG.WsPessoa.Pessoa

    /só posso fazer isso
    consultor.Pessoa = SG.ConsultorSG.ConsultarPorCodigo(idPessoa).Pessoa; //retorna o consultor inteiro e pego o objeto SG.WsConsultor.Pessoa

    Sabe me dizer se tem como fazer pra que esses objetos sejam reconhecidos apenas como "Pessoa"?

    Sds.
    João Pires



    quarta-feira, 17 de dezembro de 2008 18:51
  • João,

    Não porque são objetos diferentes. O objeto Pessoa que "vem do webservice" é um objeto que é gerado automaticamente atraves do WSDL.

    Você precisa fazer com que esse método
    SG.ConsultorSG.ConsultarPorCodigo(idPessoa) encapsule a chamada ao webservice e retorne diramente o objeto do seu domínio. Para isso, utilize o padrão Adapter.

    Abraços,
    André Azevedo
    quarta-feira, 17 de dezembro de 2008 19:06
  • Olá João,

     

    É perfeitamente possível compartilhar a mesma classe em WebServices diferentes... O único detalhe é que você precisará gerar os proxies para os WebServices manualmente, ao invés de usar o Visual Studio para criar os proxies.

     

    Você faz isso através da ferramenta WSDL, que mostro a seguir...

     

    Então, supondo que:

     

    1-) O seu primeiro WebService esteja em: http://empresa.com/WsProcesso.asmx

    2-) O seu segundo WebService esteja em: http://empresa.com/WsOficio.asmx

    3-) Ambos os WebServices compartilham uma classe chamada Processo do mesmo namespace.

     

    Tudo o que você precisa fazer, é executar a ferramenta WSDL especificando o parâmetro /ShareTypes, para indicar que você deseja que seja criado os proxies para os WebServices e também para os tipos que são compartilhados entre eles... Então vá no Command Prompt, e execute gere os proxies:

     

     

    Será gerado um arquivo com o código dos proxies... É só adicionar esse arquivo no seu projeto, instanciar as classes dos seus WebServices, e utilizar uma única classe Processo que você conhece na sua aplicação.

     

    Nota: A ferramenta WSDL normalmente está na pasta C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\, então talvez você precise colocar o caminho completo na hora de executá-la. De qualquer forma, se você utilizar o atalho para Command Prompt que está na pasta do Visual Studio, lá no menu iniciar, não precisa se preocupar com o caminho...

     

    Abraços,
    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    quinta-feira, 18 de dezembro de 2008 00:21
  • Olá, minha dúvida é parecida ...

     

    Possuo uma aplicação que roda em vários clientes. Cada cliente possui seu webservice (métodos identicos para todos).

     

    Ao invés de ter que ficar adicionando a refencia ao webservice no VS para cada cliente, existe a possibilidade de eu deixar isso dinâmico, inserindo o endereço no app.config por exemplo?

    Eu gostaria de criar uma tela de configuração na aplicação, para que eu possa digitar o endereço especifico de cada webservice para seu respectivo cliente, e não precisar ficar mexendo em codigo fonte.

     

    ???

     

    [ ]´s

    quarta-feira, 7 de janeiro de 2009 18:20
  • Prezado Marcel,

    O que você precisa está respondido no seguinte tópico:
    http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=4276096&SiteID=21

    Att.,
    André Azevedo
    quinta-feira, 8 de janeiro de 2009 12:49
  • Beleza, muito agradecido.

     

    Abraço

     

     

    quinta-feira, 8 de janeiro de 2009 12:57