Frage

Mit WCF in einer RESTful Weise scheint groß. Ich bin ein großer Fan der großen Kanonen wie Einfachheit und Flexibilität, aber ich liebe auch die Art, wie die Urls am Ende der Suche. Was kann ich sagen, ich bin ein Programmierer.

Die einfache API zum Abrufen und Bearbeiten von Ressourcen wird durch eine fast ebenso einfachen Satz von möglichen Fehlerreaktionen angepasst, und ich kann nicht helfen, das zu einem „reinen“ RESTful Ansatz zu halten Gefühl kann ich aus meiner Nase schneiden werden, um trotz von Gesicht, oder genauer gesagt, die Nase meiner Web-Service-Consumer. Ich könnte falsch sein, aber es scheint nicht sehr viele Http-Fehlercodes zu sein, die ich verwenden kann, und keine Möglichkeiten, eine benutzerdefinierte Fehlermeldung zurückzugeben.

Um zu klären, ich rede über die richtigen Ausnahmefehler und nicht zu erwarten Fehler. Ich mag wirklich ein Problem für den Benutzer kommunizieren, um ihnen zu helfen, herauszufinden, was sie tun müssen, um es zu korrigieren.

Mögliche Optionen, die ich überlege ...

  1. Sie einfach den Http-Fehlercodes verwenden - Diese scheinen, wie es zu restriktiv wäre, in dem, was ich bin in der Lage zum Ausdruck bringen, und werde mir nicht zulassen, dass eine benutzerdefinierte Nachricht liefern. Bitte (!) Korrigieren Sie mich, wenn ich falsch bin.

  2. Immer Http Erfolg zurück, aber die Rück Objekte individuelle Fehler -. Offensichtlich ist die flexibelste, aber sicherlich nicht die RESTful

Ich würde es wirklich schätzen, wenn jemand etwas reale Welt Erfahrung dieses speziellen Problems teilen könnte.


Update

Danke für die Anregung der StatusDescription Eigenschaft des OutgoingWebResponseContext Objekts zu verwenden. Es schien zunächst etwas zu sein, das ich verwenden könnte.

Ich bin zu dem Schluss gekommen, dass meine zweite Option oben nicht für mich ist. Ich möchte das bleiben, was Http kann mir geben.

Ich habe Probleme bekommen es jedoch zu arbeiten. Unabhängig von dem Wert, den ich für diese Eigenschaft liefern, ist es nicht in der Antwort zurückgegeben.

Meine Service-Methode wie folgt aussieht

public MyType GetMyTypes(string criteria)
{
    try
    {
        return GetMyTypes();
    }
    catch (Exception ex)
    {
        OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
        response.StatusCode = HttpStatusCode.Forbidden;
        response.StatusDescription = "A Big fat error occurred";
        return null;
    }
}

Und hier ist die rohe Antwortnachricht. Es gibt keinen Hinweis auf die benutzerdefinierte Nachricht ...

  

HTTP / 1.1 403 Forbidden
  Server: ASP.NET Development Server / 9.0.0.0
  Datum: Mi, 7. Januar 2009 14.01.20 GMT
  X-ASPNET-Version: 2.0.50727
  Cache-Control: privat
  Content-Length: 0
  Anschluss: Schließen

Es ist nicht so, wenn ich nur auf dem Client die richtige Eigenschaft zugreifen muß. Die Informationen werden einfach nicht über die Verbindung gesendet werden.

Was bedeutet diese StatusDescription Eigenschaft tatsächlich tun?


Update

Ich habe nie herausfinden, wie die StatusDescription Eigenschaft festzulegen. Ich landete ohne jede Fehlermeldung überhaupt, und ging nur mit dem HTTP-Statuscodes. Ich habe mich entschieden, sowohl Seife und Restful Endpunkte für meine Dienste aussetzen, und so können die Kunden wählen, die sie verwenden möchten -. Die einfachen Restful Nachrichten oder die relativ reicher Soap-Nachrichten

War es hilfreich?

Lösung

Senden Sie den richtigen Antwort-Code und Sie können die benutzerdefinierte Fehlermeldung in dem Körper der Antwort liefern.

Andere Tipps

Mit .net 4, werfen ein WebFaultException<T> (T errorDetail, HttpResponseCode code)

Hier stellen Sie Ihren Antworttyp in einem anderen Objekttyp, was Sinn macht, und auch stellen Sie die ResponseCode, die Sie wollen.

Die errorDetail muss serialisierbar sein

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

ich fügen Sie den Fehlercode sowohl, wie oben (in der Statusbeschreibung) und im Körper der zurückgegebenen Seite in meinem REST-Service wie:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;

Siehe Dieser Thread für eine ähnliche Frage.

Auf den Punkt gebracht Ich glaube, Sie den HTTP-Statuscode einstellen (auf einer der Fehlercodes), und geben Sie Ihre benutzerdefinierte Nachricht in der StatusDescription Eigenschaft:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";

Ich weiß nicht viel über die Verbreitung dieser Technik in der realen Welt leider.

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