web-dev-qa-db-fra.com

Comment obtenir des informations d'erreur lorsque HttpWebRequest.GetResponse () échoue

Je lance un HttpWebRequest, puis récupère sa réponse. Parfois, je reçois une erreur de 500 (ou au moins 5 ##), mais pas de description. Je contrôle les deux terminaux et souhaite que le destinataire reçoive un peu plus d'informations. Par exemple, j'aimerais transmettre le message d'exception du serveur au client. Est-ce possible d'utiliser HttpWebRequest et HttpWebResponse?

Code:

try
{
    HttpWebRequest webRequest = HttpWebRequest.Create(URL) as HttpWebRequest;
    webRequest.Method = WebRequestMethods.Http.Get;
    webRequest.Credentials = new NetworkCredential(Username, Password);
    webRequest.ContentType = "application/x-www-form-urlencoded";
    using(HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse)
    {
        if(response.StatusCode == HttpStatusCode.OK)
        {
            // Do stuff with response.GetResponseStream();
        }
    }
}
catch(Exception ex)
{
    ShowError(ex);
    // if the server returns a 500 error than the webRequest.GetResponse() method
    // throws an exception and all I get is "The remote server returned an error: (500)."
}

Toute aide à ce sujet serait très appréciée.

77
Trevor

Est-ce possible d'utiliser HttpWebRequest et HttpWebResponse?

Votre serveur Web pourrait simplement capturer et écrire le texte de l'exception dans le corps de la réponse, puis définir le code d'état sur 500. Le client lève une exception lorsqu'il rencontre une erreur 500, mais vous pouvez lire le flux de réponse et extraire le message de l'exception.

Ainsi, vous pourriez attraper une WebException qui sera renvoyée si un code d’état non 200 est renvoyé par le serveur et lit son corps:

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
}
135
Darin Dimitrov

Je suis tombé sur cette question en essayant de vérifier si un fichier existait ou non sur un site FTP. Si le fichier n'existe pas, il y aura une erreur en essayant de vérifier son horodatage. Mais je veux m'assurer que l'erreur n'est pas autre chose, en vérifiant son type.

La propriété Response sur WebException sera de type FtpWebResponse sur laquelle vous pourrez vérifier la propriété StatusCode à voir quelle erreur FTP tu as.

Voici le code que j'ai fini avec:

    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;
        }
    }
6
Simon_Weaver

J'ai fait face à une situation similaire:

J'essayais de lire la réponse brute dans le cas d'une erreur HTTP consommant un service SOAP, en utilisant BasicHTTPBinding.

Cependant, lors de la lecture de la réponse à l'aide de GetResponseStream(), le message d'erreur suivant s'affiche:

Flux non lisible

Donc, ce code a fonctionné pour moi:

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();
}
2
João Paulo Melo