Ver Mensaje Individual
  #7 (permalink)  
Antiguo 16/06/2011, 04:48
Avatar de moNTeZIon
moNTeZIon
 
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Respuesta: Añadir cabecera de autorización SOAP a la petición de servicio web

Hola chicos.
Finalmente lo resolví. Efectivamente no se trataba de algo extenso si no más bien de saber qué hacer.
Una vez aclarado el tema con la gente del servicio, resulta que las credenciales debían viajar en la petición HTTP, y no en la petición SOAP que va dentro de la petición HTTP.
Por lo tanto la AUTH_HEADER (o cabecera de autenticación) debía ser una cabecera HTTP, y no una cabecera SOAP.
Y sin más, a continuación les dejo cómo construir una cabecera de autenticación HTTP, con autenticación básica:

Primero aclarar que con agregar "Referencia Web" sería suficiente. Imagino que habrá la forma de hacerlo por "Referencia de Servicio", pero no me he querido pelear más con esto.
Entonces, primero construímos una clase que herede de la clase proxy del servicio.
Código VB.NET:
Ver original
  1. Public Class ServicioPruebaHeredado : Inherits ServicioPrueba.DBSOAPMethods
  2.  
  3.     Protected Overrides Function GetWebRequest(ByVal uri As Uri) As System.Net.WebRequest
  4.         Dim webRequest As System.Net.HttpWebRequest = DirectCast(MyBase.GetWebRequest(uri), System.Net.HttpWebRequest)
  5.         Credentials = New Net.NetworkCredential("UserName", "Password")
  6.         PreAuthenticate = True
  7.         Dim misCredenciales As System.Net.NetworkCredential = TryCast(Credentials, System.Net.NetworkCredential)
  8.         If Not misCredenciales Is Nothing Then
  9.             Dim authInfo As String = ((If((misCredenciales.Domain IsNot Nothing) AndAlso (misCredenciales.Domain.Length > 0), misCredenciales.Domain + "\", String.Empty)) + misCredenciales.UserName & ":") + misCredenciales.Password
  10.             authInfo = Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(authInfo))
  11.             webRequest.Headers("Authorization") = "Basic " & authInfo
  12.         End If
  13.         Return webRequest
  14.     End Function
  15.  
  16. End Class
OK, esta era la parte difícil
Ahora simplemente se trata de invocar a esta clase, en vez de a la clase proxy original, y trabajar como siempre, llamando a sus funciones y métodos.
Lo que conseguimos a través de la clase heredada, es que se le añada, a cada petición, una cabecera de autenticación con las credenciales.

Espero que le sirva a alguien.
Saludos.
__________________
..:: moNTeZIon ::..