webentwicklung-frage-antwort-db.com.de

So erhalten Sie Fehlerinformationen, wenn HttpWebRequest.GetResponse () fehlschlägt

Ich initiiere eine HttpWebRequest und erhalte dann die Antwort. Gelegentlich erhalte ich den Fehler 500 (oder mindestens 5 ##), aber keine Beschreibung. Ich habe die Kontrolle über beide Endpunkte und möchte, dass das empfangende Ende ein bisschen mehr Informationen erhält. Zum Beispiel möchte ich die Ausnahmebedingungsnachricht vom Server an den Client übergeben. Ist dies mit HttpWebRequest und HttpWebResponse möglich?

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)."
}

Jede Hilfe dabei wäre sehr dankbar.

77
Trevor

Ist dies mit HttpWebRequest und HttpWebResponse möglich?

Ihr Webserver könnte einfach den Ausnahmetext abfangen und in den Hauptteil der Antwort schreiben und dann den Statuscode auf 500 setzen. Jetzt würde der Client eine Ausnahme auslösen, wenn er auf einen 500-Fehler stößt, aber Sie könnten den Antwortdatenstrom lesen und den abrufen Nachricht der Ausnahme.

Sie könnten also eine WebException abfangen, die ausgelöst wird, wenn ein Nicht-200-Statuscode vom Server zurückgegeben und dessen Text gelesen wird:

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

Ich bin auf diese Frage gestoßen, als ich versucht habe zu überprüfen, ob eine Datei auf einer FTP-Site vorhanden ist oder nicht. Wenn die Datei nicht existiert, tritt beim Überprüfen des Zeitstempels ein Fehler auf. Aber ich möchte sicherstellen, dass der Fehler nichts anderes ist, indem ich seinen Typ überprüfe.

Die Eigenschaft Response in WebException ist vom Typ FtpWebResponse, in der Sie die Eigenschaft StatusCode überprüfen können, um festzustellen, welcher FTP-Fehler du hast.

Hier ist der Code, mit dem ich gelandet bin:

    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

Ich sah mich einer ähnlichen Situation gegenüber:

Ich habe versucht, eine unformatierte Antwort zu lesen, wenn ein HTTP-Fehler einen SOAP service mit BasicHTTPBinding verbraucht.

Beim Lesen der Antwort mit GetResponseStream() wurde jedoch der Fehler angezeigt:

Stream nicht lesbar

Also funktionierte dieser Code für mich:

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