Foros del Web » Programación para mayores de 30 ;) » .NET »

Envio y recepción SOAP con .NET

Estas en el tema de Envio y recepción SOAP con .NET en el foro de .NET en Foros del Web. Buenas, Estoy intentando hacer un cliente de webService dinámico, es decir que reciba la url, el nombre del método y los parámetros del webService, que ...
  #1 (permalink)  
Antiguo 30/11/2012, 14:57
Avatar de jhonjairo00  
Fecha de Ingreso: noviembre-2010
Ubicación: Bogotá D.C.
Mensajes: 31
Antigüedad: 13 años, 5 meses
Puntos: 6
Envio y recepción SOAP con .NET

Buenas,

Estoy intentando hacer un cliente de webService dinámico, es decir que reciba la url, el nombre del método y los parámetros del webService, que genere la petición SOAP, la envíe y capture la respuesta...

ejemplo de petición SOAP:

Código:
<?xml version="1.0" encoding="utf-8" ?> 
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
     <MyMethod xmlns="http://Localhost/MyWebService">
       <_myParameter>
          <_subParametera>Nombre</_subParametera>
          <_subParameterb>Fulano</_subParameterb>
       </_myParameter> 
       <OutputParam /> 
     </MyMethod >
  </soap:Body>
</soap:Envelope>
La particularidad es que el parámetro que debo pasar es un complexType y no sé cómo hacer para que el webservice lo reciba y lo procese...

Agradecería si alguien me puede ayudar
  #2 (permalink)  
Antiguo 06/12/2012, 10:29
Avatar de 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...
  #3 (permalink)  
Antiguo 11/12/2012, 13:37
Avatar de 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,

Por si acaso a alguien le interesa...
Además del código que puse anteriormente (con el que se captura la respuesta siempre y cuando la solicitud no traiga excepciones) también les pongo la forma de manejar la excepciones ya que anteriormente siempre arrojaba "HTTP 500 Internal Server error" cuando había excepciones.

En este caso sólo voy a poner el código de la función que hace la invocación, finalmente los otros métodos no sufrieron ninguna modificación...

Código vb:
Ver original
  1. Public Function InvokeService(ByRef bProcessOK As Boolean) As String
  2.         Dim _response As WebResponse = Nothing
  3.         Dim _strResponse As String = Nothing
  4.         Dim _req As HttpWebRequest = Me.CreateWebRequest() 'Instancia de la solicitud Http
  5.        'Creación del cuerpo de la solicitud Http
  6.        Using _stm As Stream = _req.GetRequestStream()
  7.             Using _stmw As New StreamWriter(_stm)
  8.                 _stmw.Write(Me.CreateSoapEnvelope()) 'Carga de la solicitud SOAP
  9.            End Using
  10.         End Using
  11.         Try
  12.             _response = _req.GetResponse 'Captura de la respuesta
  13.            bProcessOK = True 'Respuesta exitosa
  14.            Dim _str As Stream = _response.GetResponseStream 'Carga la respuesta
  15.            Dim _sr As New StreamReader(_str) 'Leer la respuesta
  16.            _strResponse = _sr.ReadToEnd 'Carga a una cadena
  17.            Return Me.StringResponse(HttpUtility.HtmlDecode(_strResponse)) 'Formatea la respuesta
  18.        Catch ex As WebException
  19.             bProcessOK = False 'Respuesta con excepciones
  20.            Dim _HttpResponse As HttpWebResponse = DirectCast(ex.Response, HttpWebResponse) 'Instancia de la respuesta con excepciones
  21.            'Crea el cuerpo de la respuesta con excepciones
  22.            Using streamResponse As Stream = _HttpResponse.GetResponseStream
  23.                 Using _reader As New StreamReader(streamResponse)
  24.                     Dim failureReason As String = _reader.ReadToEnd ' Carga la cadena con los detalles de la excepción
  25.                    Throw New Exception(failureReason) 'Lanza la excepción
  26.                End Using
  27.             End Using
  28.         End Try
  29.     End Function

Bueno espero que a alguien le sirva

Saludos.
  #4 (permalink)  
Antiguo 11/12/2012, 14:12
Avatar de Aquaventus  
Fecha de Ingreso: junio-2010
Ubicación: Lima-Peru , En el alba de la naturaleza
Mensajes: 2.105
Antigüedad: 13 años, 10 meses
Puntos: 267
Respuesta: Envio y recepción SOAP con .NET

Gracias por el aporte . Saludos!.
__________________
Internet es tener todo el conocimiento global a tu disposición.
Desarrollo de Software - Ejemplos .Net

Etiquetas: net, soap
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:01.