Frage

Ich gründe eine benutzerdefinierte StatusDescription in einem RESTful WCF-Dienst, wenn eine Ausnahme ausgelöst wird. Es sollte den Anrufer mit einer freundlichen Beschreibung liefern, warum sie den Fehlerstatuscode bekam.

Im Folgenden ist die Antwort, die ich in Fiddler sehen. So weiß ich, dass meine benutzerdefinierte Nachricht an den Anrufer zurück durch geschoben zu werden. Was ich kann nicht herausfinden, wie die Nachricht von .NET abzurufen. Die StatusDescription nicht diese Zeichenfolge enthalten.

Wenn Sie ein einfaches Stück Beispielcode zur Verfügung stellen könnten, das wäre toll.

  

HTTP / 1.1 500 Meldung: "Ausnahme vom Typ 'Exceptions.DataSourceNotFoundException' geworfen wurde." Uri: http://www.test1.com/
  Content-Length: 0
  Server: Microsoft-HTTPAPI / 2.0
  Datum: Mo, 20. April 2009 07.13.40 GMT

UPDATE
Die Antwort auf diese Frage nicht funktioniert in Silverlight. Getestet in Silverlight 2 und 3 Beta.

War es hilfreich?

Lösung

Nicht ein .NET-Programmierer, hat dieses auf Msdn

catch(WebException ex)
{
    string message = ((HttpWebResponse)ex.Response).StatusDescription;
}

Andere Tipps

Ich habe nicht .NET in vielen Jahren verwendet, aber in Java Menschen oft erwarten einen HTTP-Code und die Nachricht für 404 Not Found Fehler zu bekommen, während 404s tatsächlich Java eine FileNotFoundException machen werfen. Für jene Situationen, in Java sollte man verwenden? HttpURLConnection#getErrorStream statt #getResponseMessage.

Also: vielleicht etwas Ähnliches geschieht in einem .NET-Client für 500 Antworten? Tatsächlich ist die Dokumentation für HttpWebRequest heißt es:

  

Die HttpWebRequest Klasse wirft ein WebException , wenn Fehler auftreten, während Zugriff auf eine Ressource. Die WebException.Status Eigenschaft enthält ein < a href = "http://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus.aspx" rel = "nofollow noreferrer"> WebExceptionStatus Wert, der die Quelle des Fehlers anzeigt. Wenn WebException.Status ist WebExceptionStatus.ProtocolError , die Antwort Eigenschaft enthält die HttpWebResponse von der Ressource erhalten.

Detail: der Link oben auf Response bezieht sich auf WebException.Response, nicht auf HttpWebRequest.GetResponse . So WebException hat seine eigene Response Eigenschaft. Das folgende Beispiel basiert auf dem WebException.Response Dokumentation, aber ich habe es nicht getestet.

Wichtig: beachten Sie, dass dies nicht GetResponse von HttpWebRequest verwenden ist, aber Response von WebException:

try {
  HttpWebRequest myHttpWebRequest = 
      (HttpWebRequest) WebRequest.Create("http://www.example.org/not_found");
  HttpWebResponse myHttpWebResponse =
      (HttpWebResponse) myHttpWebRequest.GetResponse();
  myHttpWebResponse.Close();
}
catch(WebException e) {
  Console.WriteLine("Exception Message: " + e.Message);
  if(e.Status == WebExceptionStatus.ProtocolError) {
    Console.WriteLine("Status Code: {0}",
        ((HttpWebResponse)e.Response).StatusCode);
    Console.WriteLine("Status Description: {0}",
        ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
  Console.WriteLine(e.Message);
}

Ich denke, das Problem ist, dass Ihr Status-Code 500 ist, wenn der Statuscode nicht in Ordnung ist (200 oder irgendeine Art von Redirect), wirft WebRequest.GetResponse () eine WebException in .NET.

Diese Ausnahme enthält tatsächlich das HttpWebResponse Objekt mit dem StatusDescription Satz. Die Proben unten sind von MSDN:

public static void GetPage(String url) 
    {
        try 
           {    
                // Creates an HttpWebRequest for the specified URL. 
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
                // Sends the HttpWebRequest and waits for a response.
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
                if (myHttpWebResponse.StatusCode == HttpStatusCode.OK)
                   Console.WriteLine("\r\nResponse Status Code is OK and StatusDescription is: {0}",
                                        myHttpWebResponse.StatusDescription);
                // Releases the resources of the response.
                myHttpWebResponse.Close(); 

            } 
        catch(WebException e) 
           {
                Console.WriteLine("\r\nWebException Raised. The following error occured : {0}",e.Status); 
           }
        catch(Exception e)
        {
            Console.WriteLine("\nThe following Exception was raised : {0}",e.Message);
        }
    }

Quelle: http://msdn.microsoft .com / en-us / library / system.net.httpwebresponse.statuscode.aspx

Um tatsächlich auf dem Status, müssen Sie das HttpWebResponse Objekt aus der Ausnahme erhalten selbst:

try {
   // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");

    // Get the associated response for the above request.
     HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
    myHttpWebResponse.Close();
}
catch(WebException e) {
    Console.WriteLine("This program is expected to throw WebException on successful run."+
                        "\n\nException Message :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
        Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
        Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
    Console.WriteLine(e.Message);
}

Quelle: http://msdn.microsoft .com / en-us / library / system.net.webexception.status.aspx

Ich kann nicht sagen, ob es eine copy / paste Sache ist, aber die „Uri“. Kopfzeile auf der gleiche Linie wie der Statuscode ist -, die ein Problem sein könnten

Die meisten Grund-Codes sind ein paar Worte ohne ":" und ohne Anführungszeichen: http://tools.ietf.org/html/rfc2616#section-6.1.1 Also ich vermute, dass der Kopf-Parser denkt, dass „Meldung:“ der Start von einem HTTP-Header ist (überprüfen webResponse.Headers [ "Nachricht"]).

Sie können einen Header (zum Beispiel X-Fehler-Details) statt hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top