Asp.net web api 不使用HttpResponseMessage时如何更改响应代码?
我有一个ASP.NET Web Api控制器的示例:Asp.net web api 不使用HttpResponseMessage时如何更改响应代码?,asp.net-web-api,Asp.net Web Api,我有一个ASP.NET Web Api控制器的示例: public Mea Get(Int32 id) { try { return Meas.GetById(id) ?? new Mea(-1, 0D, 0D); } catch (Exception) { return new Mea(-1, 0D, 0D); } } 如果G
public Mea Get(Int32 id)
{
try
{
return Meas.GetById(id) ?? new Mea(-1, 0D, 0D);
}
catch (Exception)
{
return new Mea(-1, 0D, 0D);
}
}
如果GetById返回null或catch异常,我希望能够返回不同的响应代码。
我看到的所有示例都使用HttpResponseMessage,您可以在其中添加响应代码。
我的问题是在不使用HttpResponseMessage时如何更改响应代码,如上例所示?您可以抛出一个
System.Web.Http.HttpResponseException
,指定要返回给客户端的HTTP状态代码和/或可选的整个HttpResponseMessage
。如果希望从函数返回不同的响应代码,则必须将其包装在HttpResponseMessage
中
您的函数将始终返回状态代码“200”。即使返回一个裸对象,框架管道也会将其转换为默认状态代码为HttpStatusCode.OK的HttpResponseMessage
,因此最好自己完成
我建议不要从API函数返回裸对象/值。始终将值包装在HttpResponseMessage
中,然后从函数返回响应消息。基本上,通过将其包装在HttpResponseMessage
中,您可以在客户端获得正确的状态代码。返回HttpResponseMessage
始终是最佳做法
所以请像这样改变你的函数
public HttpResponseMessage Get(Int32 id)
{
try
{
// on successful execution
return this.Request.CreateResponse(HttpStatusCode.OK, Meas.GetById(id) ?? new Mea(-1, 0D, 0D));
}
catch (Exception)
{
return this.Request.CreateResponse(HttpStatusCode.InternalServerError, Mea(-1, 0D, 0D));
}
}
如果出现错误,您还可以抛出一个
HttpResponseException
,我认为这是不可能的。为什么您不喜欢HttpResponseMessage
?@sunil这只是为了方便编码,当您查看方法声明时,您可以看到它返回的内容,而不仅仅是一般的HttpResponseMessage…为什么返回HttpResponseMessage始终是最佳实践?返回对象有什么问题?@user1615362:即使返回对象,框架也会自动将其包装在HttpResponseMessage中。通过以HttpResponseMessage的形式返回,您可以从api函数中对响应进行更多控制,如果将来需要,您还可以轻松自定义响应。从类型安全的角度来看,最好返回一个“对象”。根据情况,更改HttpResponseCode时,您还可能希望返回不同类型的响应对象,例如,包括“错误原因”属性。如果您想在控制器中处理错误情况,这似乎是一条可行之路。也可以阅读微软的文章。