Ich versuche, einen Statuscode von 304 zurückzugeben, der für eine GET-Methode in einem Web-API-Controller nicht geändert wurde.
Der einzige Weg, auf dem ich Erfolg hatte, war ungefähr so:
public class TryController : ApiController
{
public User GetUser(int userId, DateTime lastModifiedAtClient)
{
var user = new DataEntities().Users.First(p => p.Id == userId);
if (user.LastModified <= lastModifiedAtClient)
{
throw new HttpResponseException(HttpStatusCode.NotModified);
}
return user;
}
}
Das Problem hierbei ist, dass es keine Ausnahme ist. Es wird nur nicht geändert, sodass der Client-Cache in Ordnung ist. Ich möchte auch, dass der Rückgabetyp ein Benutzer ist (wie alle Beispiele für Web-APIs mit GET zeigen) und nicht HttpResponseMessage oder ähnliches zurückgibt.
beta
oder bauen Sie jede Nacht ?new HttpResponseMessage(HttpStatusCode.NotModified)
? Funktioniert es nichtAntworten:
Ich kannte die Antwort nicht und fragte das ASP.NET-Team hier .
Der Trick besteht also darin, die Signatur zu ändern
HttpResponseMessage
und zu verwendenRequest.CreateResponse
.quelle
GetUser(request, id, lastModified).TryGetContentValue(out user)
, wobeiuser
(im Beispielfall) einUser
Objekt ist.IHttpActionResult
, können Sie dies einfach tun , wenn der Rückgabetyp lautet und Sie den Benutzer zurückgeben möchtenreturn Ok(user)
. Wenn Sie einen anderen Statuscode (z. B. verboten) zurückgeben müssen, können Sie dies einfach tunreturn this.StatusCode(HttpStatusCode.Forbidden)
.Sie können auch Folgendes tun, wenn Sie die Aktionssignatur als wiederkehrender Benutzer beibehalten möchten:
Wenn Sie etwas anderes als das zurückgeben möchten,
200
werfen Sie einHttpResponseException
in Ihre Aktion und übergeben das, dasHttpResponseMessage
Sie an den Client senden möchten.quelle
NotModified
ist es wirklich verschwenderisch , eine Ausnahme zu verwenden, um den häufigsten Fall zu kommunizieren . Wenn alle Ihre APIs dies getan haben, konvertiert Ihr Server meistens Watt in Ausnahmen.In MVC 5 wurde es einfacher:
quelle
Ändern Sie die GetXxx-API-Methode so, dass HttpResponseMessage zurückgegeben wird, und geben Sie dann eine typisierte Version für die vollständige Antwort und die untypisierte Version für die NotModified-Antwort zurück.
* Die ClientHasStale-Daten sind meine Erweiterung zum Überprüfen von ETag- und IfModifiedSince-Headern.
Das MVC-Framework sollte Ihr Objekt weiterhin serialisieren und zurückgeben.
HINWEIS
Ich denke, die generische Version wird in einer zukünftigen Version der Web-API entfernt.
quelle
Ich hasse es, alte Artikel zu stoßen, aber dies ist das erste Ergebnis in der Google-Suche und ich hatte verdammt viel Zeit mit diesem Problem (sogar mit der Unterstützung von euch). Also hier geht nichts ...
Hoffentlich hilft meine Lösung denen, die auch verwirrt waren.
und dann einfach vom BaseController erben
und dann mit ihm
quelle
.net Core 2.2 gibt 304 Statuscode zurück. Dies verwendet einen ApiController.
Optional können Sie ein Objekt mit der Antwort zurückgeben
quelle
Für ASP.NET Web Api 2 wird in diesem Beitrag von MS vorgeschlagen , den Rückgabetyp der Methode in zu ändern
IHttpActionResult
. Sie können dann eine eingebaute RückIHttpActionResult
Umsetzung wieOk
,BadRequest
usw. ( siehe hier ) oder eine eigene Implementierung zurück.Für Ihren Code könnte dies wie folgt erfolgen:
quelle
Andere Option:
quelle
quelle
Wenn Sie ein IHttpActionResult zurückgeben müssen und den Fehlercode plus eine Nachricht zurückgeben möchten, verwenden Sie:
quelle
Ich mag es nicht, meine Signatur ändern zu müssen, um den Typ HttpCreateResponse zu verwenden, deshalb habe ich mir eine erweiterte Lösung ausgedacht, um das zu verbergen.
Sie können dann Ihrem ApiController (oder besser Ihrem Basis-Controller) eine Methode wie folgt hinzufügen:
Dann können Sie es wie jede der integrierten Methoden zurückgeben:
quelle
Ein Update für @Aliostads Antwort unter Verwendung des
IHttpActionResult
in Web API 2 eingeführten mehr Moden .https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results#ihttpactionresult
quelle
Versuche dies :
quelle