PROBLEMAS COM XML NO WEBSERVICE

CLSCARLOS 04/10/2011 13:39:12
#385930
Pessoal, tenho o seguinte método que se conecta com o webservice da empresa X:

<System.Web.Services.Protocols.SoapRpcMethodAttribute([Ô]urn:fWSCadastraDadosProdutowsdl#fWSCadastraDadosProduto[Ô], RequestNamespace:=[Ô]urn:fWSCadastraDadosProdutowsdl[Ô], ResponseNamespace:=[Ô]urn:fWSCadastraDadosProdutowsdl[Ô]), WebMethod()> _
Public Function fWSCadastraDadosProduto(<System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal pid_loja As String, ByVal plogin As String, ByVal psenha As String, <System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal id_produto As String, <System.Xml.Serialization.SoapElementAttribute(DataType:=[Ô]integer[Ô])> ByVal id_caracteristica As String, ByVal valor As String, ByRef chaves As String) As <System.Xml.Serialization.SoapElementAttribute([Ô]status[Ô])> String
Dim results() As Object = Me.Invoke([Ô]fWSCadastraDadosProduto[Ô], New Object() {pid_loja, plogin, psenha, id_produto, id_caracteristica, valor})
chaves = CType(results(1), String)
Return CType(results(0), String)
End Function




como podem ver, ele me retorna uma String, contendo o codigo cadastrado...
todos nós sabemos que a comunicação cliente-servidor, quando se trata de webservice, é feita via XML... a questão é: há alguma forma de ao inves de retornar essa String, ele me retornar esse XML ?
KERPLUNK 04/10/2011 13:47:32
#385933
Resposta escolhida
Posta ae o endereço do webservice...
CLSCARLOS 04/10/2011 13:50:31
#385934
http://loja.tray.com.br/webservice/ws_servidor.php?wsdl
KERPLUNK 04/10/2011 14:07:12
#385938
Não costumo fazer isso, mas fiz um exemplo de como se deve consumir um webservice corretamente(em VB.NET)
Quanto à sua pergunta, funciona assim: Vc trabalha com o retorno do método, esse método([Ô]fWSCadastraDadosProduto[Ô]) retorna string, até é possível serializar como XML, teria que ver o que o método traz...
CLSCARLOS 04/10/2011 14:16:53
#385939
como assim, o que o método traz ? onde vejo isso ?

nessa string q ele retorna, ele me traz o codigo do registro q foi cadastrado...

eu tentei serializar o retorno dele, nesse método:

Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(Object()))
Dim writer As System.IO.TextWriter = New System.IO.StreamWriter([Ô]objeto.xml[Ô], False)
serializer.Serialize(writer, Me.Invoke([Ô]fWSCadastraDadosProduto[Ô], New Object() {pid_loja, plogin, psenha, id_produto, id_caracteristica, valor})
writer.Close()

( o INVOKE, me retorna um Object() )


e o xml q ele retornou foi esse:

<?xml version=[Ô]1.0[Ô] encoding=[Ô]utf-8[Ô] ?>
<ArrayOfAnyType xmlns:xsi=[Ô]http://www.w3.org/2001/XMLSchema-instance[Ô] xmlns:xsd=[Ô]http://www.w3.org/2001/XMLSchema[Ô]>
<anyType xsi:type=[Ô]xsd:string[Ô]>ok</anyType>
<anyType xsi:type=[Ô]xsd:string[Ô]>3|1291</anyType>
</ArrayOfAnyType>

mas acredito q nao seja esse o xml que vem do webservice, pois nao tem nada nele falando de wsdl e tal...
KERPLUNK 04/10/2011 14:28:05
#385940
Veja no [Ô]exemplo[Ô] que te passei, na linha
retorno = servico.fWSCadastraProduto([Ô]loj........

se vc passar o mouse sobre o método [Ô]fWSCadastraProduto[Ô], vai ver que aparecem ali todos os parâmetros e no final [Ô]As String[Ô], ou seja, isso é o retorno do método... depois de executar essa linha de comando, veja o que a variável [Ô]retorno[Ô] contém, isso é o retorno do método, ou seja, o que o método te traz...
KERPLUNK 04/10/2011 14:36:18
#385942
Citação:

( o INVOKE, me retorna um Object() )


Obviamente. Do modo como vc está fazendo, vc está invocando o método sem usar a referência, ou seja, está usando um método [Ô]genérico[Ô] para executar o método. Pelo simples fato do [Ô]Invoke[Ô] ser um modo genérico de se fazer isso, o retorno dele SEMPRE é [Ô]Object[Ô], justamente por não estar consumindo o método diretamente, ele não sabe o que pode vir, por isso, o retorno tem que ser também genérico.
CLSCARLOS 04/10/2011 14:39:06
#385943
mas há algum outro método q eu possa substituir o Invoke ? q nao seja generico...
KERPLUNK 04/10/2011 14:39:58
#385944
No exemplo que te passei, eu faço JUSTAMENTE ISSO, consumir o webmethod diretamente.
CLSCARLOS 04/10/2011 15:13:51
#385946
mas fera, vc ainda continua usando o Invoke, e aparentemente do teu codigo pro meu, mudou nada...
KERPLUNK 04/10/2011 16:21:11
#385957
Mudou sim, usando o Invoke direto, o retorno é sempre object e vc tem que usar um cast para pegar o retorno. Do modo que eu fiz, eu pego o retorno direto em uma variável string.
Tópico encerrado , respostas não são mais permitidas