web-API-und MVC-exception handling
Sind wir derzeit wieder die Entwicklung unserer web forms-system in den web-API-und MVC (dies ist eine neue Technologie für uns)
Bisher scheint alles ok zu sein, aber wir werden kämpfen, um zurück zu senden Fehlern von Web-API-Anwendung, um die MVC-Anwendung. Wir erkennen, dass wir brauchen, um alle Ausnahmen erfassen und diese verwandeln sich in HTTP-Antworten
Web-API, Produkt-controller sieht wie folgt aus:
public HttpResponseMessage GetProducts()
{
BAProduct c = new BAProduct();
var d = c.GetProducts();
if (d == null)
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "This is a custom error message");
else
return Request.CreateResponse(HttpStatusCode.OK, d);
}
Dem MVC-Anwendung aufrufen, wird die web-API mit folgendem code:-
public T Get<T>()
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri(Config.API_BaseSite);
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.GetAsync("api/myapplicaton/products").Result;
response.EnsureSuccessStatusCode();
T res = response.Content.ReadAsAsync<T>().Result;
return (T)res;
}
}
Was wir versuchen zu erreichen ist, wenn eine HTTP-Fehlermeldung empfangen wird, von der web-API innerhalb der MVC-Anwendung, die Benutzer entweder weitergeleitet, um eine benutzerdefinierte Fehlerseite, oder zeigen Sie die benutzerdefinierte Fehlermeldung in der aktuellen Ansicht (je nach schwere des Fehlers).
Das Problem, das wir haben ist, dass:-
-
Wie wir den Zugriff auf die benutzerdefinierte Fehlermeldung, die haben wir zurück geschickt? ( aus der Beispiel-code wäre dies "Dies ist eine benutzerdefinierte Fehlermeldung", haben Wir durch jedes Attribut im res und kann nicht sehen, diese Nachricht)
-
Je nach status-code, wie wir erfassen diese und leiten Sie Benutzer, um individuelle Fehler-Seiten, d.h. die Seite 404, 500-Seite und anzeigen der benutzerdefinierten response-Nachricht, die gesendet wurde, zurück.
wir haben seit der globalen.asax routeprotected void Application_Error(object sender, EventArgs e) { Exception exception = Server.GetLastError(); Response.Clear(); HttpException httpException = exception as HttpException;
jedoch unsere httpExecption ist immer NULL
Wir haben gesucht etc, und als der noch, nicht finden können, was gegebenenfalls
hoffentlich kann mir jemand weisen uns in die richtige Richtung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum Ihr httpException-Instanz null ist, weil die
response.EnsureSuccessStatusCode();
Methode nicht geworfen einHttpException
das ist, was Sie versuchen, zu wirken, zu. Es wirft einHttpRequestException
was anders ist, hat aber keinen einfachen Weg, um weitere details (wie dem status-code für Beispiel).Als alternative zu dem Aufruf dieser Methode, die Sie testen könnten
IsSuccessStatusCode
boolean-Eigenschaft, und werfen einHttpException
selbst:Diese
HttpException
könnte jetzt gefangen werden in IhremApplication_Error
und je nach status-code gehen Sie mit der Handhabung:In diesem Beispiel gehe ich davon aus, dass Sie eine
ErrorsController
mit den jeweiligen Aktionen (Http500, Http403, Http404, ...). Die jeweilige Aktion aufgerufen werden, die je nach status-code und Sie können wieder unterschiedliche Ansichten.UPDATE:
Möchten Sie vielleicht, um zu erfassen zusätzliche Artefakte der HTTP-Anforderung wie die reason phrase, so dass Sie hängen Sie es in Ihrem Fehler-Seite. In diesem Fall können Sie einfach schreiben Sie Ihre eigene Ausnahme, die enthalten die Informationen, die Sie benötigen:
dass Sie werfen könnte:
und arbeiten Sie dann mit dieser benutzerdefinierte Ausnahme in Ihrem
Application_Error
.Application_Error
erreicht? War dieErrorsController
ausgeführt? Wie hast du das definieren der entsprechenden error-Seite? Hast du auch definieren einErrorsController
? Sollten Sie keine benutzerdefinierten Fehler definiert in Ihrem web.config, da in diesem Beispiel alle die Behandlung erfolgt inApplication_Error
. Es wird überspringen, benutzerdefinierte Fehlerseiten, die Sie haben könnten, definiert.HttpException
dann die benutzerdefinierte Fehlermeldung in derex.Message
. Wenn Sie dieApiException
dann wird es imex.Reason
. Der Zweck der Verwendung einer ApiException ist, dass es Ihnen ermöglicht zu erfassen, die Reaktion des Körpers in Ergänzung zu den Grund. Im HTTP-Protokoll Sie können status-code (200, ...), Grund (so etwas wie eine Beschreibung für den status-code) und der response-body.CreateErrorResponse
- Methode serialisiert die Nachricht als Teil der Antwort der Körper-und nicht als Grund. Ich update meine Antwort. Könnten Siethrow new HttpException((int)response.StatusCode, response.Content.ReadAsStringAync().Result);
um der Lage sein, um übergeben Sie die Antwort Körper als message der exception. Und dann rufen Sie es mitex.Message
.throw new HttpException((int)response.StatusCode, response.Content.ReadAsStringAync().Result);
. Und anschließend in die Application_Error verwendenex.Message
die Fehlermeldung zu bekommen. Auch der Zweck derApiException
ist überhaupt nicht geteilt werden zwischen dem Web-API-und MVC-Anwendung. Diese Klasse ist nur in der MVC-Anwendung. Ihre Web-API nicht wissen nichts über es. Es wird verwendet, um transport-nützliche Informationen über den Fehler zu Application_Error event, die sonst nicht verfügbar sein.Einen hervorragenden Beitrag zur Lösung des obigen Problems ist hier
Es hat im wesentlichen zwei Hauptschritte-
Schritt-1 : Deserialisiert den Inhalt in der HTTP-Fehler-Ergebnisse, z.B.
Schritt 2: Hinzufügen Fehler im ModelState Wörterbücher Client-Seite
string Fehlermeldungen Hinzugefügt apiEx.Fehler mit deserializedErrorObject.
Sehen die link