Próbuję zwrócić kod stanu 304 niezmodyfikowany dla metody GET w kontrolerze interfejsu API sieci Web.
Jedynym sposobem, w jaki mi się udało, było coś takiego:
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;
}
}
Problem polega na tym, że nie jest to wyjątek, po prostu nie jest modyfikowany, więc pamięć podręczna klienta jest OK. Chcę również, aby typem zwracanym był użytkownik (jak pokazują wszystkie przykłady interfejsu WWW z GET), nie zwracał HttpResponseMessage ani czegoś takiego.
beta
lub budujesz w nocy ?new HttpResponseMessage(HttpStatusCode.NotModified)
? Nie działa?Odpowiedzi:
Nie znałem odpowiedzi, więc zapytałem tutaj zespół ASP.NET .
Zatem sztuczka polega na zmianie podpisu
HttpResponseMessage
i użyciuRequest.CreateResponse
.źródło
GetUser(request, id, lastModified).TryGetContentValue(out user)
, gdzieuser
(w tym przypadku) jestUser
obiektem.IHttpActionResult
i chcesz zwrócić użytkownika, możesz to zrobićreturn Ok(user)
. Jeśli chcesz zwrócić inny kod stanu (powiedzmy zabronione), możesz to zrobićreturn this.StatusCode(HttpStatusCode.Forbidden)
.Możesz również wykonać następujące czynności, jeśli chcesz zachować podpis akcji jako powracający użytkownik:
Jeśli chcesz zwrócić coś innego niż
200
wtedy, wrzuciszHttpResponseException
akcję i przekazujesz wiadomość,HttpResponseMessage
którą chcesz wysłać do klienta.źródło
NotModified
jest naprawdę marnotrawstwem. Jeśli wszystkie interfejsy API to zrobiły, serwer będzie w większości konwertuje waty do wyjątków.W MVC 5 stało się łatwiej:
źródło
Zmień metodę API GetXxx, aby zwracała HttpResponseMessage, a następnie zwróć wersję napisaną dla pełnej odpowiedzi i wersję nietypową dla odpowiedzi Niezmodyfikowanej.
* Dane ClientHasStale to moje rozszerzenie do sprawdzania nagłówków ETag i IfModifiedSince.
Struktura MVC powinna nadal serializować i zwracać obiekt.
UWAGA
Myślę, że wersja ogólna jest usuwana w niektórych przyszłych wersjach interfejsu API sieci Web.
źródło
Nienawidzę podrzucać starych artykułów, ale jest to pierwszy wynik tego w wyszukiwarce Google i świetnie się bawiłem z tym problemem (nawet przy wsparciu was). Więc tutaj nie ma nic ...
Mam nadzieję, że moje rozwiązanie pomoże tym, którzy również byli zdezorientowani.
a następnie po prostu odziedziczyć od BaseController
a następnie używając go
źródło
.net core 2.2 zwraca kod statusu 304. To używa ApiController.
Opcjonalnie możesz zwrócić obiekt z odpowiedzią
źródło
W przypadku ASP.NET Web Api 2 ten post od MS sugeruje zmianę typu zwracanej metody na
IHttpActionResult
. Następnie można powrócić wbudowany wIHttpActionResult
realizacji podobnegoOk
,BadRequest
itp ( patrz tutaj ) lub zwrócić swoją realizację.W przypadku kodu można to zrobić w następujący sposób:
źródło
Inna opcja:
źródło
źródło
Jeśli chcesz zwrócić IHttpActionResult i chcesz zwrócić kod błędu plus komunikat, użyj:
źródło
Nie lubię zmieniać podpisu, aby użyć typu HttpCreateResponse, więc wymyśliłem trochę rozszerzonego rozwiązania, aby to ukryć.
Następnie możesz dodać metodę do ApiController (lub lepiej kontrolera podstawowego) w następujący sposób:
Następnie możesz zwrócić go tak jak każdą z wbudowanych metod:
źródło
Aktualizacja odpowiedzi @Aliostads przy użyciu większej ilości modów
IHttpActionResult
wprowadzonych w Web API 2.https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results#ihttpactionresult
źródło
Spróbuj tego :
źródło