Ver Mensaje Individual
  #2 (permalink)  
Antiguo 04/08/2011, 06:07
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Aplicación no se puede comunicar a webservices en conexiones con proxy

Voy a tratar de replantear el problema.
- El programa que hice tiene que enviar un XML que se almacenará tal y como está en una base de datos. Para ello realiza una petición HttpRequest dirigida a un script de PHP que está en la web, en una página.

Carga de parámetros y petición:
Código vb:
Ver original
  1. oScript = "setactivate"
  2.                         oWB = New BridgeClass.WebBridge
  3.                         With oWB
  4.                             .Parametro = "usr=" & Convert.ToString(oTabla.Rows(0).Item("unm"))
  5.                             .Parametro = "pwd=" & Convert.ToString(oTabla.Rows(0).Item("prd"))
  6.                             .Parametro = "fecha=" & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  7.                             .Parametro = "pet=A"
  8.                             .Parametro = "stat=P"
  9.                             .Parametro = "soft=1"
  10.                             .Parametro = "xmlMsg=" & oXml
  11.                             .Parametro = "c=" & wBase
  12.                             .Parametro = "q=" & pSoft
  13.                             .Parametro = "t=" & uSoft
  14.                         End With
  15.                         GetData(1)
- "setactivate" es el nombre del script.
- BridgeClass es una clase creada para generar el enlace, enviar la petición y recibir la respuesta.
- oXML es un String conteniendo el XML, en formato texto plano.
- c, q, t, son los parámetros de base, usuario y password que se utilizarán en el script. El resto son diferentes parámetros del script.
- AL crear el objeto solo se cargan los parámetros c, q y t.

Envío de petición (GetData())
Código vb:
Ver original
  1. Private Function GetData(ByVal View As Byte) As DataSet
  2.             'Establecer los valores del objeto WebBridge y lamara a Connect()
  3.            Dim Xdoc As New Xml.XmlDocument
  4.             DSet = New DataSet
  5.             With oWB
  6.                 .URL = oPath & oScript & ".php"
  7.                 .PostData = "view=" & View & "&" & .Parametros
  8.                 .Connect()
  9.             End With
  10.             Try
  11.                 Xdoc.LoadXml(oWB.XMLResponse)
  12.                 Dim sReader As New StringReader(Xdoc.InnerXml)
  13.                 DSet.ReadXml(sReader)
  14.             Catch ex As System.Xml.XmlException
  15.                 Return New DataSet
  16.             Catch ex As Exception
  17.                 DSet = New DataSet
  18.             End Try
  19.             Return DSet
  20.         End Function
- En esta parte se combinan la URL cargada, el nombre del script y los parámetros.
- Connect() es el que genera toda la tarea.

Conexión, petición y respuesta:
Código vb:
Ver original
  1. Public Sub Connect()
  2.             ServicePointManager.UseNagleAlgorithm = True
  3.             ServicePointManager.Expect100Continue = False
  4.             ServicePointManager.CheckCertificateRevocationList = True
  5.             ServicePointManager.DefaultConnectionLimit = ServicePointManager.DefaultPersistentConnectionLimit
  6.             ' ---------------------------------------------------------------------------------
  7.            Dim rq As WebRequest = WebRequest.Create(URL)
  8.             Dim newUri As Uri
  9.             Dim pr As System.Net.WebProxy
  10.             Try
  11.                 With rq
  12.                     If nuevoLogin.RegServer.RutaProxy <> "" Then
  13.                         pr = New System.Net.WebProxy(login.RgServer.UrlProxy, Convert.ToInt32(login.RgServer.PortProxy))
  14.                         rq.Proxy = pr
  15.                     End If
  16.                     .Method = "POST"
  17.                     .ContentType = "application/x-www-form-urlencoded"
  18.                     If _to > 0 Then
  19.                         .Timeout = _to
  20.                     End If
  21.                 End With
  22.                 SendData(rq, PostData)
  23.                 _rsp = GetXMLResponse(rq)
  24.             Catch ex As System.Net.WebException
  25.                 oLogWriter.Escribir("WebExcepción en WebBridge.Connect()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
  26.             Catch ex As Exception
  27.                 oLogWriter.Escribir("Excepción en WebBridge.Connect()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
  28.             End Try
  29.         End Sub
- login.RgServer.UrlProxy es la url local donde está el proxy, según declaró el usuario.
- login.RgServer.PortProxy es el Port del proxy declarado por el usuario.
- SendData() envía la petición.

SendData
Código vb:
Ver original
  1. Private Sub SendData(ByRef req As WebRequest, ByVal data As String)
  2.             Dim sr As Stream
  3.             Dim b As Byte() = Encoding.UTF8.GetBytes(data)
  4.             req.ContentLength = b.Length
  5.             If _to > 0 Then
  6.                 Try
  7.                     sr = req.GetRequestStream()
  8.                 Catch ex As System.Net.WebException
  9.                     Dim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes("F")
  10.                     sr = New MemoryStream(bytes)
  11.                     oLogWriter.Escribir("WebExcepción en WebBridge.SendData()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
  12.                 Catch ex As Exception
  13.                     Dim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes("F")
  14.                     sr = New MemoryStream(bytes)
  15.                     oLogWriter.Escribir("Excepción en WebBridge.SendData()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
  16.                 End Try
  17.             Else
  18.                 sr = req.GetRequestStream()
  19.             End If
  20.             sr.Write(b, 0, b.Length)
  21.             sr.Close()
  22.         End Sub

Este es el conjunto de códigos que se usa. En esta última función es donde se manifiesta el problema, simplemente no puede salir o retornar el envío al script.
El problema es que sólo falla si el usuario tiene un proxy propio instalado (usualmente en algunas), pero no trae problemas en ningún otro caso, incluyendo conexiones hogareñas, publicas con WiFi, o la que sea. Sólo si hay un proxy en ese sitio, y obviamente no se les puede pedir que lo quiten...

¿Hay algún error en estos códigos? ¿Habrá una forma de evitar este problema?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)