Estou tentando retornar um código de status 304 não modificado para um método GET em um controlador de API da web.
A única maneira de obter sucesso foi algo assim:
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;
}
}
O problema aqui é que não é uma exceção, apenas não é modificado para que o cache do cliente esteja OK. Também quero que o tipo de retorno seja um Usuário (como todos os exemplos de API da Web mostram com GET) não retorne HttpResponseMessage ou algo assim.
beta
ou construção noturna ?new HttpResponseMessage(HttpStatusCode.NotModified)
? Isso não funciona?Respostas:
Eu não sabia a resposta, então perguntei à equipe do ASP.NET aqui .
Portanto, o truque é alterar a assinatura
HttpResponseMessage
e usá-laRequest.CreateResponse
.fonte
GetUser(request, id, lastModified).TryGetContentValue(out user)
, ondeuser
(no caso de exemplo) é umUser
objeto.IHttpActionResult
e você deseja devolver o usuário, basta fazê-loreturn Ok(user)
. Se você precisar retornar outro código de status (por exemplo, proibido), basta fazê-loreturn this.StatusCode(HttpStatusCode.Forbidden)
.Você também pode fazer o seguinte se desejar preservar a assinatura da ação como Usuário que retorna:
Se você deseja retornar algo diferente,
200
então você lança umHttpResponseException
em sua ação e passa oHttpResponseMessage
que deseja enviar ao cliente.fonte
NotModified
é realmente um desperdício. Se todas as suas APIs fizeram isso, o servidor estará convertendo principalmente watts em exceções.No MVC 5, as coisas ficaram mais fáceis:
fonte
Altere o método da API GetXxx para retornar HttpResponseMessage e, em seguida, retorne uma versão digitada para a resposta completa e a versão não digitada para a resposta NotModified.
* Os dados do ClientHasStale são minha extensão para verificar os cabeçalhos ETag e IfModifiedSince.
A estrutura MVC ainda deve serializar e retornar seu objeto.
NOTA
Eu acho que a versão genérica está sendo removida em alguma versão futura da API da Web.
fonte
Eu odeio esbarrar em artigos antigos, mas este é o primeiro resultado disso na pesquisa do google e passei um tempão com esse problema (mesmo com o apoio de vocês). Então aqui não vai nada ...
Espero que minha solução ajude aqueles que também estavam confusos.
e depois apenas herdar do BaseController
e depois usá-lo
fonte
.net core 2.2 retornando código de status 304. Isso está usando um ApiController.
Opcionalmente, você pode retornar um objeto com a resposta
fonte
Para o ASP.NET Web Api 2, esta postagem da MS sugere alterar o tipo de retorno do método para
IHttpActionResult
. Você pode então voltar um construído emIHttpActionResult
implementação, comoOk
,BadRequest
, etc ( ver aqui ) ou retornar a sua própria implementação.Para o seu código, isso pode ser feito como:
fonte
Outra opção:
fonte
fonte
Se você precisar retornar um IHttpActionResult e desejar retornar o código de erro mais uma mensagem, use:
fonte
Não gosto de alterar minha assinatura para usar o tipo HttpCreateResponse, então criei um pouco de uma solução estendida para ocultar isso.
Você pode adicionar um método ao seu ApiController (ou melhor, ao seu controlador de base) assim:
Em seguida, você pode devolvê-lo como qualquer um dos métodos incorporados:
fonte
Uma atualização para o @Aliostads responde usando o moden mais
IHttpActionResult
introduzido na Web API 2.https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results#ihttpactionresult
fonte
Tente o seguinte:
fonte