我试图返回一个状态代码304未修改的web api控制器中的GET方法。

我成功的唯一方法是这样的:

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;
    }
}

这里的问题是,它不是一个异常,它只是没有修改,所以客户端缓存是OK的。 我还希望返回类型是一个用户(所有的web api示例显示与GET)不返回HttpResponseMessage或类似的东西。


当前回答

试试这个:

return new ContentResult() { 
    StatusCode = 404, 
    Content = "Not found" 
};

其他回答

我不知道答案所以问ASP。NET团队。

因此,诀窍是将签名更改为HttpResponseMessage并使用Request.CreateResponse。

[ResponseType(typeof(User))]
public HttpResponseMessage GetUser(HttpRequestMessage request, int userId, DateTime lastModifiedAtClient)
{
    var user = new DataEntities().Users.First(p => p.Id == userId);
    if (user.LastModified <= lastModifiedAtClient)
    {
         return new HttpResponseMessage(HttpStatusCode.NotModified);
    }
    return request.CreateResponse(HttpStatusCode.OK, user);
}

如果您希望将操作签名保留为返回User,还可以执行以下操作:

public User GetUser(int userId, DateTime lastModifiedAtClient) 

如果你想返回200以外的值,那么你在你的动作中抛出一个HttpResponseException,并传递你想要发送给客户端的HttpResponseMessage。

使用Web API 2中引入的更现代的IHttpActionResult对@Aliostads进行了更新。

https://learn.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results#ihttpactionresult

public class TryController : ApiController
{
    public IHttpActionResult GetUser(int userId, DateTime lastModifiedAtClient)
    {
        var user = new DataEntities().Users.First(p => p.Id == userId);
        if (user.LastModified <= lastModifiedAtClient)
        {
            return StatusCode(HttpStatusCode.NotModified);
            // If you would like to return a Http Status code with any object instead:
            // return Content(HttpStatusCode.InternalServerError, "My Message");
        }
        return Ok(user);
    }
}

试试这个:

return new ContentResult() { 
    StatusCode = 404, 
    Content = "Not found" 
};

.net core 2.2返回304状态码。这是使用ApiController。

    [HttpGet]
    public ActionResult<YOUROBJECT> Get()
    {
        return StatusCode(304);
    }

您还可以选择返回带有响应的对象

    [HttpGet]
    public ActionResult<YOUROBJECT> Get()
    {
        return StatusCode(304, YOUROBJECT); 
    }