Was ist der beste Weg, um Fehler von einem WCF-Dienst in einem RESTful Weg zurück?
-
03-07-2019 - |
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 ...
-
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.
-
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
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
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.
Dies kann ein Defekt sein. Ab 2011.09.22, ist die Frage nach Überprüfung durch das Produktteam: