Zurückgeben einer Fehlermeldung, die auf einen Endbenutzer auf die Ausnahme in der WebApi Methoden
Ich bin derzeit am Aufbau einer WebApi-service, der verbindet sich mit dem backoffice von meiner Anwendung, so dass der Benutzer auf eine Schaltfläche löst eine Reihe von web-service-Anfragen auslösen, dass meine Umbraco-website mit aktualisierten Inhalten.
Die Klasse für meinen WebApi service-setup als so:
public class MyController : UmbracoApiController{
//Global variable declarations go here
private MyController(){
//assign actual values to global variables here
}
public string GetAllUpdates(){
try{
GetCountries();
GetAreas();
GetCities();
...
}
catch (TimeoutException ex)
{
Log.Error("Web Service Timeout", ex);
return "Failed to contact web services.";
}
catch (Exception ex)
{
Log.Error("Exception", ex);
return "An error has occurred.";
}
}
public string GetCountries(){
try{
//Main code here
}
catch(TimeoutException ex){
Log.Error("Web Service Timeout", ex);
return "Failed to contact web services.";
}
catch(Exception ex){
Log.Error("Exception", ex);
return "An error has occurred.";
}
}
.....
}
Meinen WebApi-Methode aufgerufen werden, die durch die Verwendung von AngularJS und HTML. Wenn ein Benutzer auf die Schaltfläche klickt, bezogen auf eine Web-Api-Methode, die Methode ausgeführt wird, dann erfolgt eine Rückmeldung an den Nutzer über den Erfolg oder Misserfolg der Methode.
So, wenn ich zu laufen waren die GetCountries () - Methode über den entsprechenden button eine Nachricht würde auf dem Bildschirm angezeigt werden, die sagen "Ländern erfolgreich aktualisiert" bei Erfolg oder stattdessen wäre es die Ausgabe eine der Nachrichten, die zurückgegeben werden, in den catch-Definitionen.
Mein Hauptproblem ist, dass die GetAllUpdates () - Methode wird ausgeführt, alle anderen Methoden, eine nach der anderen. Das ist in Ordnung und ich wieder eine Nachricht bei Erfolg den Worten "Alle Inhalte aktualisiert", jedoch ist die Einrichtung wirklich auseinander fällt, wenn eine Ausnahme ist der hit in eine der anderen Methoden. Zum Beispiel, GetCountries() wird zuerst ausgeführt. Wenn eine Ausnahme ausgelöst wird, hier wird keine Meldung auf dem Bildschirm zurückgegeben und die Anwendung bewegt sich einfach auf die nächste Methode GetAreas(). Dieser breitet sich durch bis zum Ende, wo der Erfolg Nachricht wird dann angezeigt, dass der Benutzer den falschen Eindruck, dass das update gut gelaufen.
Meine Frage ist daher wie kann ich das anhalten der GetAllUpdates () - Methode ausgeführt nachfolgenden Methoden in der Kette, wenn eine Ausnahme Auftritt, ohne änderungen zurück in meine anderen Methoden? Die Methoden müssen einen string zurückgeben, so dass die Nachricht auf dem Bildschirm angezeigt wird, wenn Sie auf Ihre eigenen laufen jedoch, wenn lief als Teil von GetAllUpdates() die Fehlermeldungen werden zurückgegeben, der den catch-Blöcken behandelt werden, als wenn die Methode wurde erfolgreich abgeschlossen und der Benutzer wird nicht klüger.
Jegliche Hilfe würde sehr geschätzt werden.
N. B. Nachdem Sie eine der unten aufgeführten Antworten ich veränderte meine WebApi Methode, um Folgendes zu tun:
NEUE KLASSE
public class ResponseMessage
{
public bool Result { get; set; }
public string Message { get; set; }
}
RETURN-ON-METHODEN
ResponseMessage response = new ResponseMessage();
String json = string.Empty;
response.Result = true;
response.Message = "Content update successful";
json = JsonConvert.SerializeObject(response);
return json;
Mein Winkel-code ist wie folgt:
angular.module("umbraco")
.controller("AxumTailorMade",
function ($scope, $http, AxumTailorMade) {
$scope.getAll = function() {
$scope.load = true;
$scope.info = "Retreiving updates";
AxumTailorMade.getAll().success(function (data) {
var response = JSON.parse(data);
$scope.result = response.Result;
$scope.info = response.Message;
$scope.load = false;
});
};
});
angular.module("umbraco.services").factory("AxumTailorMade", function ($http) {
return {
getAll: function () {
return $http.get("/umbraco/api/axumtailormade/getallupdates");
},
getRegions: function () {
return $http.get("/umbraco/api/axumtailormade/getregions");
},
getCountries: function () {
return $http.get("/umbraco/api/axumtailormade/getcountries");
},
getAreas: function () {
return $http.get("/umbraco/api/axumtailormade/getareas");
},
getCities: function () {
return $http.get("/umbraco/api/axumtailormade/getcities");
},
getCategories: function () {
return $http.get("/umbraco/api/axumtailormade/getcategories");
},
getPackages: function () {
return $http.get("/umbraco/api/axumtailormade/getpackages");
},
getHotels: function () {
return $http.get("/umbraco/api/axumtailormade/gethotels");
},
getActivities: function () {
return $http.get("/umbraco/api/axumtailormade/getactivities");
}
};
})
- Sie werfen sollten Fehler oder Fehler erlauben, sich von Ihrem service-Aufruf. Schlucken Sie nicht den Fehler und ein Ergebnis zurückgeben. Wenn ein Fehler ausgelöst wird, das Versprechen abgelehnt, und Antwort.Daten enthält die Ausnahme
- Ausnahmen sind nicht end-user lesbar sind und nicht zurückgegeben werden soll, in einer solchen Weise. Auch, werfen Fehler und es Ihnen ermöglicht, sich in diesem Fall würde das bedeuten, dass der Fehler ausgelöst werden den ganzen Weg bis zu den privaten Instanziierung Methode der Klasse, die nicht für alle Nachrichten werden wieder in den end-Benutzer verlassen Sie mit keine Rückmeldung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eher als Rückgabe einen string von Ihren Methoden, könntest du statt return ein einfaches Objekt, welches das Ergebnis und die Nachricht für den Kunden?
Dann bei der Ausführung
GetAllUpdates()
würden Sie ErgebnisGetCountries()
,GetAreas()
undGetCities()
aus, und fügen Sie alle Fehlermeldungen.Es ist ein wenig mehr Aufwand und code, sondern gibt Ihnen auch mehr Kontrolle über den Ablauf und was zurückgegeben wird an den client. Könnte man auch optimieren, es ziemlich eine Menge, die ich sicher bin, dass ich nur Stub, ein Allgemeines Konzept für Sie...
Ich würde vorschlagen, dass Sie tatsächlich loszuwerden, die
GetAllUpdates()
- Methode, und rufen Sie die besonderenGet****()
Methoden getrennt von AngularJS.Dies hätte folgende Vorteile:
Sie können daher behandeln die einzelnen Fehler unabhängig voneinander, während der Vermietung, da viele der Methoden erfolgreich wie möglich.
Wenn Sie nicht wollen/benötigen, rufen Sie den jeweiligen Methoden parallel, wäre es immer noch besser, meiner Meinung nach, nennen Sie eins nach dem anderen, hing der Aufruf an jeden nachfolgenden aus seinem Vorgänger Versprechen (siehe "Verkettung Verspricht" hier: https://docs.angularjs.org/api/ng/service/$q)
Schließlich - ich würde nicht wieder einen string von der WebAPI Methoden. Eher - sollten Sie wieder einen HTTP-200-code, für den Erfolg (D. H. die Methoden, die void ist, und es einfach nicht tun, nichts besonderes), oder eine bestimmte HTTP-code für was auch immer Fehler passiert ist.
In Winkel können Sie dann verwenden .catch (), die Ausnahmen zu behandeln. Auf diese Weise werden Ihre Nachrichten nicht beschlossen werden, in der WebAPI-code - aber auf der client-Seite.
Wie kann man return-status 401 von WebAPI zu AngularJS und auch eine benutzerdefinierte Nachricht?
EDIT:
Wenn die client-side-option ist nicht möglich, ich würde die Anrufe von geschachtelten try - /catch-Blöcke in den server-code:
Alternativ könnte man die Aufrufe und die entsprechenden Fehlermeldungen in Listen:
und dann die Methoden aufrufen, die in einer for-Schleife:
Sinn? (Sorry wenn der code nicht kompilieren, ich bin nicht der überprüfung, die es einem compiler leider)