Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/12/2012, 10:29
Avatar de jhonjairo00
jhonjairo00
 
Fecha de Ingreso: noviembre-2010
Ubicación: Bogotá D.C.
Mensajes: 31
Antigüedad: 13 años, 5 meses
Puntos: 6
Respuesta: Envio y recepción SOAP con .NET

Buenas,

Ya está solucionado...

Lo que hice fue crear una clase que crea un HttpWebRequest dinámico, en donde se pasan los datos del servidor, el método, los parámetros, el cuerpo de la petición SOAP y el namespace y así por fin logré la conexión y la respuesta, aquí les dejo el código por si acaso a alguien le es de utilidad

Cita:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text

Imports System.ServiceModel
Imports System.ServiceModel.Description

Imports System.Net
Imports System.IO
Imports System.Web
Imports System.Text.RegularExpressions
Imports System.Runtime.Remoting.Messaging

Public Class WebServiceClient

#Region "Delegates"
Public Delegate Function DelegateInvokeService()
#End Region

#Region "Enumerators"
Public Enum ServiceType
Traditional = 0
WCF = 1
End Enum
#End Region

#Region "Classes"
Public Class Parameter
Private _Name As String
Private _Value As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Public Property Value() As String
Get
Return _Value
End Get
Set(ByVal value As String)
_Value = value
End Set
End Property
End Class
#End Region


#Region "Atributtes and Properties"
Private _Url As String
Private _WebMetod As String
Private _Parameters As List(Of Parameter)
Private _WSServiceType As ServiceType
Private _WCFContractName As String
Private _nSpace As String
Private _soapEnvelope As String
Public Property Url() As String
Get
Return _Url
End Get
Set(ByVal value As String)
_Url = value
End Set
End Property
Public Property WebMethod() As String
Get
Return _WebMetod
End Get
Set(ByVal value As String)
_WebMetod = value
End Set
End Property
Public Property Parameters() As List(Of Parameter)
Get
Return _Parameters
End Get
Set(ByVal value As List(Of Parameter))
_Parameters = value
End Set
End Property
Public Property WSServiceType() As ServiceType
Get
Return _WSServiceType
End Get
Set(ByVal value As ServiceType)
_WSServiceType = value
End Set
End Property
Public Property WCFContractName() As String
Get
Return _WCFContractName
End Get
Set(ByVal value As String)
_WCFContractName = value
End Set
End Property
Public Property nSpace() As String
Get
Return _nSpace
End Get
Set(ByVal value As String)
_nSpace = value
End Set
End Property
Public Property soapEnvelope() As String
Get
Return _soapEnvelope
End Get
Set(ByVal value As String)
_soapEnvelope = value
End Set
End Property
#End Region

#Region "Private Methods"
Private Function CreateSoapEnvelope()
Dim MethodCall As String = "<web:" & Me.WebMethod & ">"
Dim StrParameters As String = String.Empty
For Each _param As Parameter In Me.Parameters
StrParameters = StrParameters & "<web:" & _param.Name & ">" & _param.Value & "</web:" & _param.Name & ">"
Next
MethodCall = MethodCall & StrParameters & "</web:" & Me.WebMethod & ">"
Dim sb As New StringBuilder(soapEnvelope)
sb.Insert(sb.ToString.IndexOf("</soapenv:Body>"), MethodCall)
Return sb.ToString
End Function
Private Function CreateWebRequest() As HttpWebRequest
Dim _webRequest As HttpWebRequest = DirectCast(WebRequest.Create(Me.Url), HttpWebRequest)
If Me.WSServiceType = ServiceType.WCF Then
_webRequest.Headers.Add("SOAPAction", "http://tempuri.org/" & Me.WCFContractName & "/" & Me.WebMethod & "\")
Else
If Me.nSpace.Chars(_nSpace.Length - 1) <> "/" Then Me.nSpace &= "/"
_webRequest.Headers.Add("SOAPAction", "" & Me.nSpace & Me.WebMethod & "")
End If
_webRequest.Headers.Add("To", Me.Url)
_webRequest.ContentType = "text/xml;charset=""uft-8"""
_webRequest.Accept = "text/xml"
_webRequest.Method = "POST"
Return _webRequest
End Function
Private Function StringResponse(ByVal SoapResponse As String) As String
Dim RegexExtract As String = "<" & Me.WebMethod & "Result>(?<Result>.*?)</" & Me.WebMethod & "Result>"
Return Regex.Match(SoapResponse, RegexExtract).Groups("Result").Captures(0).Value
End Function
#End Region

#Region "Public Methods"
Public Sub BeginInvokeService(ByVal InvokeCompleted As AsyncCallback)
Dim Invoke As New DelegateInvokeService(AddressOf Me.InvokeService)
Dim result As IAsyncResult = Invoke.BeginInvoke(InvokeCompleted, Nothing)
End Sub
Public Function EndInvokeService(ByVal result As IAsyncResult) As String
Dim _asyngResult = DirectCast(result, AsyncResult)
Dim msg As ReturnMessage = DirectCast(_asyngResult.GetReplyMessage, ReturnMessage)
Return msg.ReturnValue.ToString
End Function
Public Function InvokeService() As String
Dim _response As WebResponse = Nothing
Dim _strResponse As String = Nothing
Dim _req As HttpWebRequest = Me.CreateWebRequest()
Using _stm As Stream = _req.GetRequestStream()
Using _stmw As New StreamWriter(_stm)
_stmw.Write(Me.CreateSoapEnvelope())
End Using
End Using
Try
_response = _req.GetResponse
Catch ex As Exception
Return ex.Message
End Try
Dim _str As Stream = _response.GetResponseStream
Dim _sr As New StreamReader(_str)
_strResponse = _sr.ReadToEnd
Return Me.StringResponse(HttpUtility.HtmlDecode(_strRespo nse))
End Function
Public Function InvokeService(ByRef bProcessOK As Boolean) As String
Dim _response As WebResponse = Nothing
Dim _strResponse As String = Nothing
Dim _req As HttpWebRequest = Me.CreateWebRequest()
Using _stm As Stream = _req.GetRequestStream()
Using _stmw As New StreamWriter(_stm)
_stmw.Write(Me.CreateSoapEnvelope())
End Using
End Using
Try
_response = _req.GetResponse
bProcessOK = True
Catch ex As Exception
bProcessOK = False
Return ex.Message
End Try
Dim _str As Stream = _response.GetResponseStream
Dim _sr As New StreamReader(_str)
_strResponse = _sr.ReadToEnd
Return Me.StringResponse(HttpUtility.HtmlDecode(_strRespo nse))
End Function
#End Region

End Class
Ahora lo único que queda es validar que cuando hayan excepciones de tipo SOAP las capture de manera correcta, porque de esta manera lo que sucede es que siempre que hay excepciones del lado del servidor el mensaje del response es "Error en el servidor remoto: (500) Error interno del servidor." y no especifica nada más...

Seguiré buscando y si encuentro algo lo posteo, claro que si alguien conoce la solución también lo agradecería...