Saltar al contenido

Cómo obtener información de error cuando HttpWebRequest.GetResponse() falla

Te damos la bienvenida a nuestro sitio, en este lugar vas a hallar la solucíon a lo que buscabas.

Solución:

¿Es esto posible usando HttpWebRequest y HttpWebResponse?

Puede hacer que su servidor web simplemente atrape y escriba el texto de la excepción en el cuerpo de la respuesta, luego establezca el código de estado en 500. Ahora el cliente generaría una excepción cuando encuentre un error 500, pero podría leer el flujo de respuesta y obtener el mensaje de la excepción.

Por lo tanto, podría capturar una WebException, que es lo que se lanzará si no es 200 código de estado es devuelto por el servidor y lee su cuerpo:

catch (WebException ex)

    using (var stream = ex.Response.GetResponseStream())
    using (var reader = new StreamReader(stream))
    
        Console.WriteLine(reader.ReadToEnd());
    

catch (Exception ex)

    // Something more serious happened
    // like for example you don't have network access
    // we cannot talk about a server exception here as
    // the server probably was never reached

Encontré esta pregunta cuando intentaba verificar si existía un archivo en un sitio FTP o no. Si el archivo no existe, habrá un error al intentar verificar su marca de tiempo. Pero quiero asegurarme de que el error no sea otra cosa, comprobando su tipo.

los Response propiedad en WebException será de tipo FtpWebResponse en el que puedes comprobar su StatusCode propiedad para ver qué error de FTP tiene.

Aquí está el código con el que terminé:

    public static bool FileExists(string host, string username, string password, string filename)
    
        // create FTP request
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + host + "/" + filename);
        request.Credentials = new NetworkCredential(username, password);

        // we want to get date stamp - to see if the file exists
        request.Method = WebRequestMethods.Ftp.GetDateTimestamp;

        try
        
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            var lastModified = response.LastModified;

            // if we get the last modified date then the file exists
            return true;
        
        catch (WebException ex)
        
            var ftpResponse = (FtpWebResponse)ex.Response;

            // if the status code is 'file unavailable' then the file doesn't exist
            // may be different depending upon FTP server software
            if (ftpResponse.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
            
                return false;
            

            // some other error - like maybe internet is down
            throw;
        
    

Me enfrenté a una situación similar:

Estaba tratando de leer la respuesta sin procesar en caso de un error HTTP que consumía un servicio SOAP, usando BasicHTTPBinding.

Sin embargo, al leer la respuesta usando GetResponseStream()obtuve el error:

Transmisión no legible

Entonces, este código funcionó para mí:

try

    response = basicHTTPBindingClient.CallOperation(request);

catch (ProtocolException exception)

    var webException = exception.InnerException as WebException;
    var rawResponse = string.Empty;

    var alreadyClosedStream = webException.Response.GetResponseStream() as MemoryStream;
    using (var brandNewStream = new MemoryStream(alreadyClosedStream.ToArray()))
    using (var reader = new StreamReader(brandNewStream))
        rawResponse = reader.ReadToEnd();

Recuerda que puedes optar por la opción de aclarar si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *