Asp.Net Web-Api - Rückgabe 404 für IEnumerable<T> Bekommen, Wenn null
Ich bin erstellen einer API mit der release-version von Asp.Net Web-Api. Ich bin versucht, wieder übergeben Sie die richtige Antwort-code (404), wenn keine Ergebnisse gefunden werden.
Erste Version (wirft mehrere enumeration error):
public IEnumerable<MyObjectType> Get(int id, string format)
{
var db = new DbEntities();
var result = db.pr_ApiSelectMyObjectType(store, id, format).AsEnumerable();
if (result.Any())
{
return result;
}
var response = new HttpResponseMessage(HttpStatusCode.NotFound)
{ Content = new StringContent("Unable to find any results") };
throw new HttpResponseException(response);
}
Zweite Version (das Ergebnis ist nie null, also es gibt immer 200):
public IEnumerable<MyObject> Get(int id, string format)
{
var db = new DbEntities();
var result = db.pr_ApiSelectMyObjectType(store, id, format);
if (result == null)
{
var response = new HttpResponseMessage(HttpStatusCode.NoContent)
{ Content = new StringContent("Unable to find any results") };
throw new HttpResponseException(response);
}
return result.AsEnumerable();
}
Wie gebe ich wieder eine 404, wenn keine Ergebnisse gefunden werden? Ich weiß, ich könnte eine Liste verwenden, aber ich habe eine benutzerdefinierte csv-Medien-Typ formatter, dass funktioniert nur mit IEnumerable-Arten, so würde ich lieber mit dem stick.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besserer Ansatz ist, fangen
null
bei action filter, definieren Sie eine Aktion, filter mit einem globalen Gültigkeitsbereich, und werfen Ausnahme 404 aus diesem:Mit auf diese Weise, Sie brauchen nicht zu verwenden
Any
in Ihrem action-code wäre einfacher:Ist es wahrscheinlich am einfachsten, einfach konvertieren Sie die Ergebnisse in eine Liste, die kann offensichtlich aufgelistet mehrfach:
Natürlich heißt materialisieren die ganze Abfrage... aber vermutlich würden Sie am Ende tut das eh irgendwann.
result.Count != 0
schneller sein soll als es nutzen nicht dieEnumerable
'sAny
Erweiterung Methode erzeugt ein iterator-block, sondern eine Liste der Eigenschaft. 2. Mit web API und OData v2, werden Sie wahrscheinlich wollen, um zurückzukehren IQueryable und nicht-Liste (oder IEnumerable).Any()
ist optimiert fürICollection<T>
Implementierungen sowieso, aber es ist potentiell viel effizienter als die Verwendung vonCount()
in Fällen, in denen es eine gefilterte Sequenz.