从Web Api控制器返回http状态码
我试图返回一个状态代码304没有修改的GET方法在一个web api控制器。
我成功的唯一方式就是这样的:
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;
}
}
这里的问题是,它不是一个例外,它只是没有修改,所以客户端缓存是好的。 我也希望返回类型是一个用户(因为所有的web api实例用GET显示)不会返回HttpResponseMessage或类似的东西。
我不知道答案,所以在这里问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);
}
如果您想将操作签名保留为返回用户,您还可以执行以下操作:
public User GetUser(int userId, DateTime lastModifiedAtClient)
如果你想返回200
以外的东西,那么你在你的动作中抛出一个HttpResponseException
,并传入你想发送给客户端的HttpResponseMessage
。
更改GetXxx API方法以返回HttpResponseMessage,然后返回完整响应的打字版本和NotModified响应的非打字版本。
public HttpResponseMessage GetComputingDevice(string id)
{
ComputingDevice computingDevice =
_db.Devices.OfType<ComputingDevice>()
.SingleOrDefault(c => c.AssetId == id);
if (computingDevice == null)
{
return this.Request.CreateResponse(HttpStatusCode.NotFound);
}
if (this.Request.ClientHasStaleData(computingDevice.ModifiedDate))
{
return this.Request.CreateResponse<ComputingDevice>(
HttpStatusCode.OK, computingDevice);
}
else
{
return this.Request.CreateResponse(HttpStatusCode.NotModified);
}
}
* ClientHasStale数据是我的扩展,用于检查ETag和IfModifiedSince标题。
MVC框架仍然应该序列化并返回您的对象。
注意
我认为通用版本将在未来版本的Web API中被删除。
链接地址: http://www.djcxy.com/p/20545.html