96 votes

c# Comment obtenir les informations d'erreur lors de l'HttpWebRequest.GetResponse() échoue

Je prends un HttpWebRequest et ensuite récupérer la réponse. Parfois, je reçois un 500 (ou au moins 5##) erreur, mais pas de description. J'ai le contrôle sur les deux points de terminaison et voudrais la réception pour obtenir un peu plus d'informations. Par exemple, je voudrais faire passer le message de l'exception à partir du serveur vers le client. Est-ce possible à l'aide de 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 serait bien apprécié.

172voto

Darin Dimitrov Points 528142

Est-ce possible à l'aide de HttpWebRequest et HttpWebResponse?

Vous pourriez avoir votre serveur web simplement de capture et d'écrire le texte de l'exception dans le corps de la réponse, puis définissez le code d'état à 500. Maintenant, le client génère une exception lorsqu'il rencontre une erreur 500, mais vous avez pu lire le flux de réponse et extraire le message de l'exception.

Donc, vous pourriez attraper un WebException qui est ce qui va être jeté, si un code d'état 200 est retourné par le serveur et de le lire dans 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
}

10voto

Simon_Weaver Points 31141

Je suis tombé sur cette question lorsque vous essayez de vérifier si un fichier existe sur un site FTP ou pas. Si le fichier n'existe pas, il y aura une erreur lorsque j'essaie de vérifier son timestamp. Mais je veux être sûr que l'erreur n'est pas quelque chose d'autre, par la vérification de son type.

L' Response bien sur WebException sera de type FtpWebResponse sur lequel vous pouvez vérifier sa StatusCode de la propriété pour voir qui FTP erreur que vous avez.

Voici le code que j'ai terminé 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;
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X