Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

spipo

VB.NET + WEB SERVICE + HTTPS/SSL + CREDENTIALS

Mensagens Recomendadas

spipo

Olá,

Este é o meu primeiro post, na qual peço-vos imensas desculpas pelos acentos que possivelmente nao poderei acentuar algumas palavras porque o meu teclado é em espanhol, ademais penso que irei meter alguns termos em espanhol também (apesar de revisar todo).  :hmm:

O tema em si é talvez um poco avançado, portanto se nao existerem respostas nao haverá nenhum problema. Aviso que ja pesquisei imensas páginas por internet (google) e estou com isto faz já 2 semanas e nao encontro soluçao. Provei de tudo que encontrei e mesmo assim sai-me sempre o mesmo erro. Qualquer sugestao, direi se ja a provei e o que me retornou como possivel erro.

SITUACAO:

Estou a trabalhar com um cliente, que por sua vez têm um servicio web por https (feito com Apache (implementacao API JAX-RPC) ou seja feito em Java e nao Microsoft) na qual tenho que me conectar ao servicio, chamar a funcao, enviar os parametros e receber o retorno da funcao (string). Por sua vez para conectar ao servicio web tenho que passar as credenciais de acesso e además agregar o certificado no "mmc" dos certificados de confianza. Para além do servicio web ser por https com certificado, faz falta passar a password e o usuario de acceso.

Accedo correctamente ao servicio web por internet explorer,firefox...visualizo correctamente a ".wsdl", depois de por correctamente o usuario e a password de acceso. O problema vem a seguir....a nivel de visual studio.

FERRAMENTA:

PROJECTO WINDOWS + VS 2008 + FRAMEWORK 3.5

PROBLEMA:

1) Nao consigo agregar o servicio web atraves do "Add Web reference" (para que me genere o cliente) porque ao agregar pede-me o usuario e a password para visualizar o .wsdl

2) Passo as credenciais y devolve ("System.Net.WebException: Error de la solicitud con una respuesta vacía.") (dor de cabeça esta aqui:

O QUE FIZ ATÉ O MOMENTO:

Para resolver o problema 1) fiz:

1) Para generar o cliente (para poder-me conectar ao servicio web), tentei com ferramenta de microsoft que se chama:

 

  wsdl.exe - na qual passo o endereço web + usuario + password ...y NADA, diz-me que o servicio web nao respeita as caracteristicas de um servicio web (muito curioso) y tentei outra opçao.

  Outra opçao que utilizei:

  - Entrei directamente no endereço https, copiei o codigo fonte que genera o .wsdl e voltei a executar a herramenta wsdl.exe, e tudo perfeito. Estive a leer por aí que também existe outra forma que considerei mais correcta que seria copiar o codigo fonte do .wsdl e guardar-lo com extensao .wsdl e agregar como referencia web ao visual studio apuntando directamente para o directorio de onde se encontra o ficheiro e maravilha funcionou também, tendo cuidado depois de mudar o "location" do servicio para o de produçao e nao para o http//127. (onde foi generado)

2) O cabeçudo: (+ técnico)

Para conectar-me ao servicio web depois de ter ultrapassado a fase de generar o cliente ( que creio que o fiz correctamente, ja que nao me funcionou directamente com a ferramente wsdl.exe de visual studio ) faço o seguinte:

1 Método:



Dim oWS As New TrackingWS.TrackingWSService

'AGREGO AS CREDENCIAIS DO SERVICIO WEB ANTES DE CHAMAR A FUNCAO
Dim certRawData As Byte() = System.IO.File.ReadAllBytes("PATH")
Dim signedCert As New X509Certificate(certRawData, "PASSOWRD")

oWS.ClientCertificates.Add(signedCert)

'PASSO AS CREDENCIALES DE ACCESO AO SERVICIO WEB
Dim oCred As New System.Net.CredentialCache()
Dim netCred As New Net.NetworkCredential("USER", "PASSWORD")
oCred.Add(New Uri(oWS.Url), "Basic", netCred)

oWS.Credentials = oCred

'CHAMO A FUNCAO
oWS.tracking(WSTrackingEvent)

2 Método:

Tentar enviar o conteudo através da http post: (a primitivo)

Funciona de maravilha, ao conectar-se, mas o problema é que o parámetro que recebe a funcao do servicio web é 1 array de uma classe definida por eles. E construir isso por "soap,envelope" é uma m_ _ _a das grandes.

Alguém tem alguma ideia de como pode ser algo entorno a isso? Construir o "envelope" para enviar por post....algo que com o cliente que se genera, o faz "automaticamente"


        Try

            Dim x509 As New X509Certificate2()
            Dim store As New X509Store(StoreLocation.LocalMachine)
            Dim certRawData As Byte()

                certRawData = System.IO.File.ReadAllBytes("PATH")
                x509.Import(certRawData)

                store.Open(OpenFlags.ReadWrite)

                store.Add(x509)

                ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3

                'Http GET
                Dim webReq As HttpWebRequest
                webReq = DirectCast(WebRequest.Create("https://extranet'RUTA'wsdl"), HttpWebRequest)
                webReq.Method = "GET"
                webReq.ContentType = "text/xml"
                webReq.ClientCertificates.Add(x509)
                webReq.Credentials = New NetworkCredential("USER", "PASSWORD")

                Dim sSoapAction As String = String.Empty
                webReq.Headers.Add("SOAPAction: " + sSoapAction)
                Dim sendStream As Stream = webReq.GetRequestStream()
                'Solicitud de poner texto en la corriente de solicitud 
                Dim strmWrtr As StreamWriter = New StreamWriter(sendStream)
                Dim sSoapEnv As String = String.Empty
                strmWrtr.Write(sSoapEnv)

                strmWrtr.Close()
                'la solicitud y obtener la respuesta
                Dim wResp As WebResponse = Nothing

                Dim strmRdr As StreamReader = Nothing


                Dim sResult As String = String.Empty

                Try

                    wResp = webReq.GetResponse()

                    Dim respStrm As Stream = wResp.GetResponseStream()

                    strmRdr = New StreamReader(respStrm)

                  'devuelve  la respuesta como una cadena
                    sResult = strmRdr.ReadToEnd()

                Catch ex As Exception
                    sResult = "Error Web Request: " & vbNewLine & ex.Message
                End Try

                store.Close()


                MsgBox(sResult)

        Catch ex As Exception
	MsgBox(ex.ToString())
        End Try

PS: O código é de provas, esta preparado para POST/GET, mudando o método (.Method) para 'POST', construindo o envelope.

Dim sSoapEnv As String = String.Empty

Alguma sugestao? Alguém que tenha trabalhado nesse entorno poderá sugerir algo?

Um muito obrigado.


Saludos,Carlos Menezes

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.