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 originaloScript = "setactivate"
oWB = New BridgeClass.WebBridge
With oWB
.Parametro = "usr=" & Convert.ToString(oTabla.Rows(0).Item("unm"))
.Parametro = "pwd=" & Convert.ToString(oTabla.Rows(0).Item("prd"))
.Parametro = "fecha=" & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
.Parametro = "pet=A"
.Parametro = "stat=P"
.Parametro = "soft=1"
.Parametro = "xmlMsg=" & oXml
.Parametro = "c=" & wBase
.Parametro = "q=" & pSoft
.Parametro = "t=" & uSoft
End With
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 originalPrivate Function GetData(ByVal View As Byte) As DataSet
'Establecer los valores del objeto WebBridge y lamara a Connect()
Dim Xdoc As New Xml.XmlDocument
DSet = New DataSet
With oWB
.URL = oPath & oScript & ".php"
.PostData = "view=" & View & "&" & .Parametros
.Connect()
End With
Try
Xdoc.LoadXml(oWB.XMLResponse)
Dim sReader As New StringReader(Xdoc.InnerXml)
DSet.ReadXml(sReader)
Catch ex As System.Xml.XmlException
Return New DataSet
Catch ex As Exception
DSet = New DataSet
End Try
Return DSet
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 originalPublic Sub Connect()
ServicePointManager.UseNagleAlgorithm = True
ServicePointManager.Expect100Continue = False
ServicePointManager.CheckCertificateRevocationList = True
ServicePointManager.DefaultConnectionLimit = ServicePointManager.DefaultPersistentConnectionLimit
' ---------------------------------------------------------------------------------
Dim rq As WebRequest = WebRequest.Create(URL)
Dim newUri As Uri
Dim pr As System.Net.WebProxy
Try
With rq
If nuevoLogin.RegServer.RutaProxy <> "" Then
pr = New System.Net.WebProxy(login.RgServer.UrlProxy, Convert.ToInt32(login.RgServer.PortProxy))
rq.Proxy = pr
End If
.Method = "POST"
.ContentType = "application/x-www-form-urlencoded"
If _to > 0 Then
.Timeout = _to
End If
End With
SendData(rq, PostData)
_rsp = GetXMLResponse(rq)
Catch ex As System.Net.WebException
oLogWriter.Escribir("WebExcepción en WebBridge.Connect()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
Catch ex As Exception
oLogWriter.Escribir("Excepción en WebBridge.Connect()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
End Try
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 originalPrivate Sub SendData(ByRef req As WebRequest, ByVal data As String)
Dim sr As Stream
Dim b As Byte() = Encoding.UTF8.GetBytes(data)
req.ContentLength = b.Length
If _to > 0 Then
Try
sr = req.GetRequestStream()
Catch ex As System.Net.WebException
Dim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes("F")
sr = New MemoryStream(bytes)
oLogWriter.Escribir("WebExcepción en WebBridge.SendData()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
Catch ex As Exception
Dim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes("F")
sr = New MemoryStream(bytes)
oLogWriter.Escribir("Excepción en WebBridge.SendData()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
End Try
Else
sr = req.GetRequestStream()
End If
sr.Write(b, 0, b.Length)
sr.Close()
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?