J'essaie de retourner un code d'état de 304 non modifié pour une méthode GET dans un contrôleur web api.
La seule façon dont j'ai réussi était quelque chose comme ça:
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;
}
}
Le problème ici est que ce n'est pas une exception, il n'est tout simplement pas modifié donc le cache client est OK. Je veux également que le type de retour soit un utilisateur (comme le montrent tous les exemples d'API Web avec GET) et non pas HttpResponseMessage ou quelque chose comme ça.
beta
ou construisez -vous tous les soirs ?new HttpResponseMessage(HttpStatusCode.NotModified)
? Ça ne marche pas?Réponses:
Je ne connaissais pas la réponse alors j'ai demandé à l'équipe ASP.NET ici .
L'astuce consiste donc à modifier la signature
HttpResponseMessage
et à l'utiliserRequest.CreateResponse
.la source
GetUser(request, id, lastModified).TryGetContentValue(out user)
, oùuser
(dans le cas de l'exemple) est unUser
objet.IHttpActionResult
et que vous souhaitez renvoyer l'utilisateur, vous pouvez simplement le fairereturn Ok(user)
. Si vous devez renvoyer un autre code d'état (par exemple, interdit), vous pouvez le fairereturn this.StatusCode(HttpStatusCode.Forbidden)
.Vous pouvez également effectuer les opérations suivantes si vous souhaitez conserver la signature d'action en tant qu'utilisateur de retour:
Si vous voulez retourner autre chose que
200
vous lancez unHttpResponseException
dans votre action et passez le queHttpResponseMessage
vous voulez envoyer au client.la source
NotModified
est vraiment un gaspillage. Si toutes vos API l'ont fait, votre serveur convertira principalement les watts en exceptions.Dans MVC 5, les choses sont devenues plus faciles:
la source
Modifiez la méthode GetXxx API pour renvoyer HttpResponseMessage, puis renvoyez une version typée pour la réponse complète et la version non typée pour la réponse NotModified.
* Les données ClientHasStale sont mon extension pour vérifier les en-têtes ETag et IfModifiedSince.
Le framework MVC doit toujours sérialiser et renvoyer votre objet.
REMARQUE
Je pense que la version générique est supprimée dans une future version de l'API Web.
la source
Je déteste heurter les anciens articles, mais c'est le premier résultat pour cela dans la recherche Google et j'ai eu beaucoup de mal avec ce problème (même avec le soutien de vous). Alors ça ne va rien ...
J'espère que ma solution aidera ceux qui ont également été confus.
puis juste hériter du BaseController
puis l'utiliser
la source
.net core 2.2 renvoyant le code de statut 304. Cela utilise un ApiController.
Vous pouvez éventuellement renvoyer un objet avec la réponse
la source
Pour ASP.NET Web Api 2, ce message de MS suggère de changer le type de retour de la méthode en
IHttpActionResult
. Vous pouvez ensuite revenir construit dans laIHttpActionResult
mise en œuvre commeOk
,BadRequest
, etc ( voir ici ) ou retourner votre propre implémentation.Pour votre code, cela pourrait se faire comme:
la source
Une autre option:
la source
la source
Si vous devez renvoyer un IHttpActionResult et que vous souhaitez renvoyer le code d'erreur plus un message, utilisez:
la source
Je n'aime pas avoir à changer ma signature pour utiliser le type HttpCreateResponse, j'ai donc proposé une petite solution étendue pour masquer cela.
Vous pouvez ensuite ajouter une méthode à votre ApiController (ou mieux votre contrôleur de base) comme ceci:
Ensuite, vous pouvez le renvoyer comme n'importe quelle méthode intégrée:
la source
Une mise à jour de la réponse @Aliostads utilisant le plus de modens
IHttpActionResult
introduit dans l'API Web 2.https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results#ihttpactionresult
la source
Essaye ça :
la source