Nachdem ich einen Artikel über die Ausnahmebehandlung in der ASP.NET-Web-API gelesen habe, bin ich etwas verwirrt darüber, wann eine Ausnahme ausgelöst oder eine Fehlerantwort zurückgegeben werden soll. Ich frage mich auch, ob es möglich ist, die Antwort zu ändern, wenn Ihre Methode ein domänenspezifisches Modell anstelle von HttpResponseMessage
... zurückgibt.
Um es hier noch einmal zusammenzufassen: Meine Fragen, gefolgt von einem Code mit den Fallnummern:
Fragen
Fragen zu Fall 1
- Sollte ich immer
HttpResponseMessage
anstelle eines konkreten Domänenmodells verwenden, damit die Nachricht angepasst werden kann? - Kann die Nachricht angepasst werden, wenn Sie ein konkretes Domänenmodell zurückgeben?
Fragen zu Fall Nr. 2,3,4
- Sollte ich eine Ausnahme auslösen oder eine Fehlerantwort zurückgeben? Wenn die Antwort "es kommt darauf an" lautet, können Sie Situationen / Beispiele angeben, wann eine gegen die andere verwendet werden soll.
- Was ist der Unterschied zwischen Werfen
HttpResponseException
vsRequest.CreateErrorResponse
? Die Ausgabe an den Client scheint identisch zu sein ... - Sollte ich immer verwenden
HttpError
, um Antwortnachrichten in Fehler zu "verpacken" (ob die Ausnahme ausgelöst oder eine Fehlerantwort zurückgegeben wird)?
Fallbeispiele
// CASE #1
public Customer Get(string id)
{
var customer = _customerService.GetById(id);
if (customer == null)
{
var notFoundResponse = new HttpResponseMessage(HttpStatusCode.NotFound);
throw new HttpResponseException(notFoundResponse);
}
//var response = Request.CreateResponse(HttpStatusCode.OK, customer);
//response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
return customer;
}
// CASE #2
public HttpResponseMessage Get(string id)
{
var customer = _customerService.GetById(id);
if (customer == null)
{
var notFoundResponse = new HttpResponseMessage(HttpStatusCode.NotFound);
throw new HttpResponseException(notFoundResponse);
}
var response = Request.CreateResponse(HttpStatusCode.OK, customer);
response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
return response;
}
// CASE #3
public HttpResponseMessage Get(string id)
{
var customer = _customerService.GetById(id);
if (customer == null)
{
var message = String.Format("customer with id: {0} was not found", id);
var errorResponse = Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
throw new HttpResponseException(errorResponse);
}
var response = Request.CreateResponse(HttpStatusCode.OK, customer);
response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
return response;
}
// CASE #4
public HttpResponseMessage Get(string id)
{
var customer = _customerService.GetById(id);
if (customer == null)
{
var message = String.Format("customer with id: {0} was not found", id);
var httpError = new HttpError(message);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, httpError);
}
var response = Request.CreateResponse(HttpStatusCode.OK, customer);
response.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddSeconds(300));
return response;
}
Aktualisieren
Um die Fälle Nr. 2,3,4 weiter zu demonstrieren, werden im folgenden Codeausschnitt verschiedene Optionen hervorgehoben, die "auftreten können", wenn ein Kunde nicht gefunden wird ...
if (customer == null)
{
// which of these 4 options is the best strategy for Web API?
// option 1 (throw)
var notFoundMessage = new HttpResponseMessage(HttpStatusCode.NotFound);
throw new HttpResponseException(notFoundMessage);
// option 2 (throw w/ HttpError)
var message = String.Format("Customer with id: {0} was not found", id);
var httpError = new HttpError(message);
var errorResponse = Request.CreateErrorResponse(HttpStatusCode.NotFound, httpError);
throw new HttpResponseException(errorResponse);
// option 3 (return)
var message = String.Format("Customer with id: {0} was not found", id);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
// option 4 (return w/ HttpError)
var message = String.Format("Customer with id: {0} was not found", id);
var httpError = new HttpError(message);
return Request.CreateErrorResponse(HttpStatusCode.NotFound, httpError);
}