Pregunta

Tengo una aplicación escrita en VB.NET ( no asp.net, es una aplicación de consola de Windows). Estoy tratando de llamar a una URL (una página html) y volver a la respuesta en una cadena. La respuesta es recta JSON, sin etiquetas HTML en absoluto. Se abre con { y se cierra con }.

crear el HttpWebRequest bien objeto. A continuación, llame req.GetResponse(). Tan pronto como lo hago me sale el error The underlying connection was closed: The connection was closed unexpectedly. He estado buscando en Google y comprobar stackoverflow y probado todo lo que he encontrado que se aplica (mucho de esto tiene que ver con configuraciones de servicio WCF, que no se aplican).

Aquí está mi código:

Public Function GetJSON(ByRef d As db.Device) As Boolean
    Try
        d.Url = "http://" & d.IpAddress & ini.doc.<svc>.<url>.Value

        Dim req As HttpWebRequest = HttpWebRequest.Create(d.Url)
        // req.Accept = "*/*"
        // req.Timeout = 30000
        // req.ReadWriteTimeout = 30000
        // req.KeepAlive = False
        // req.UseDefaultCredentials = True
        // req.CachePolicy = HttpWebRequest.DefaultCachePolicy
        // req.Proxy = HttpWebRequest.DefaultWebProxy
        // req.ProtocolVersion = New System.Version(1, 0)

        Dim rsp As HttpWebResponse = req.GetResponse()

        Return True
    Catch ex As Exception
        Log(ex.Message)
        Return False
    Finally
        rsp = Nothing
        req = Nothing
    End Try
End Function

Las líneas comentadas (estilo comentario equivocado, pero tan analizará bien) son todas las cosas que he probado hasta ahora basada en lo que he encontrado en línea. Ninguno de ellos lo arreglaron. He comprobado que el ser construida URL es correcta; si llamo a la exacta misma dirección URL en el navegador devuelve exactamente el derecho de esperar la respuesta.

He intentado wiresharking ella ... y veo a los esperados, los datos completos reales vienen atrás en la salida de tiburón, y luego un par de líneas, y luego una línea roja que dice: http > 51943 [RST] Seq=1607 Win=0 Len=0 que es la última línea para aparecer antes de .NET está lanzando el error.

También traté de encender System.Net / rastreo de registro por un puesto aquí en la SO, y en el archivo de salida de lo que veo de manera similar todos los datos JSON esperados ¿Tiene volver, pero después se vuelve que arroja estas líneas en el registro de seguimiento .NET:

System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#60467532::Receive()   -> 1605#1605
System.Net.Sockets Verbose: 0 : [7040] Socket#60467532::Receive()
System.Net.Sockets Verbose: 0 : [7040] Data from Socket#60467532::Receive
System.Net.Sockets Verbose: 0 : [7040] 00000000 :                                                 : 
System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#60467532::Receive()   -> 0#0
System.Net.Sockets Verbose: 0 : [7040] Socket#60467532::Dispose()
System.Net Error: 0 : [7040] Exception in the HttpWebRequest#27806816:: - The underlying connection was closed: The connection was closed unexpectedly.
System.Net Error: 0 : [7040] Exception in the HttpWebRequest#27806816::GetResponse - The underlying connection was closed: The connection was closed unexpectedly.

¿Alguna idea dónde ir para tratar de resolver esto? Estamos leyendo estos datos de algunos dispositivos sensores de monitorización del medio ambiente, y que nos dio este URL para su uso.

Dos cosas que realmente reciben y me confunden sobre esto son que
a) funciona perfectamente bien cuando se le llama en un navegador
b) tanto WireShark y .NET trazado mostrar todos los datos realmente es a volver, y el marco es por alguna razón, excepto después de recibir toda la información!

El WebException en sí está siendo muy poco uso, como su InnerException es nulo y su Estado sólo dice "ConnectionClosed {8}"

Gracias de antemano !!!

ACTUALIZACIÓN 08/18 1130: También he intentado ahora utilizando sólo System.Net.WebRequest en contraposición a HttpWebRequest. Esto no hace ninguna diferencia tampoco.

ACTUALIZACIÓN 08/18 1222: Sólo traté de cambiar mi código en lugar de utilizar [Http]Web[Request|Response] a la regulación a más de un objeto WebClient lugar y el uso de su método DownloadString(). Sin embargo, esto también lanza el mismo error exacto.

ACTUALIZACIÓN 08/18 1230:. intentado usar My.Computer.Network.DownloadFile() - también recibe el error cerrado misma conexión

¿Fue útil?

Solución

Se puede publicar todo el contenido del registro de seguimiento en pastebin.com y publicar un enlace aquí?

podría estar recibiendo esta excepción porque el servidor podría decir en "Content-Length" de cabecera que está enviando n bytes de entidad, pero en realidad está enviando menos de N bytes y el cierre de la conexión.

Respuesta:

Gracias por los datos. Desde el tracelog y rastrear Wireshark, parece que el servidor no está enviando los encabezados de respuesta, y enviar directamente los datos. Se trata de una violación del protocolo HTTP. Es por ello que el cliente está lanzando la excepción.

Otros consejos

Así es como lo tengo trabajo ... Gracias a Feroze para mí apuntando en la dirección correcta!
(Puntúan)

Public Function GetJSON(ByRef d As db.Device) As Boolean
    Try
        Dim tcp = New TcpClient()
        tcp.Connect(d.IpAddress, 80)

        Dim ns = tcp.GetStream()

        Dim req As Byte() = System.Text.Encoding.ASCII.GetBytes(
            "GET /getdata.htm HTTP/1.1" & vbCrLf & vbCrLf
        )
        ns.Write(req, 0, req.Length)

        Dim rsp(2048) As Byte, rcv As Integer
        Do
            rcv = ns.Read(rsp, 0, rsp.Length)
            d.JSON &= System.Text.Encoding.ASCII.GetString(rsp, 0, rcv)
        Loop Until rcv = 0

        tcp.Close()

        Return True
    Catch ex As Exception
        Log(ex.Message)
        Return False
    End Try
End Function

Esto me ayuda. Espero que ayude a alguien así.

Justo después de crear objetos HttpWebRequest, añadir esta línea.

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;

Lo que significa es especifica el Secure Socket Layer (SSL) 3.0 como protocolo de seguridad

http://support.microsoft.com/kb/915599

Comprobar el estado latente de la solicitud. Si se trata de más de unos pocos ms entonces vale la pena deshabilitar el algoritmo de Nagle

 ServicePointManager.UseNagleAlgorithm = false;

Yo estaba teniendo el mismo problema con respecto a una solicitud sin un cuerpo. En mi caso, el establecimiento de la ContentLength a CERO solucionado el problema.

En mi caso, el problema fue que utiliza "http: // .." como dirección de servicio en lugar de "https: //" ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top