【问题标题】:How to change the response code when not using HttpResponseMessage?不使用 HttpResponseMessage 时如何更改响应代码?
【发布时间】:2013-10-31 17:09:17
【问题描述】:

我有这个 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);
        }
    }

如果 GetById 返回 null 或在 catch 异常中,我希望能够返回不同的响应代码。 我看到的所有示例都使用 HttpResponseMessage ,您可以在其中添加响应代码。 我的问题是如何在不使用 HttpResponseMessage 时更改响应代码,如上例所示?

【问题讨论】:

  • 我觉得做不到。你为什么不喜欢HttpResponseMessage
  • @sunil 这只是为了编码方便,当您查看方法声明时,您会看到它返回的内容,而不仅仅是通用的 HttpResponseMessage...

标签: asp.net-web-api


【解决方案1】:

如果你想从你的函数返回不同的响应代码,那么你必须将它包装在HttpResponseMessage 中。

您的函数将始终返回状态代码“200”。即使您返回一个裸对象,框架管道也会将其转换为具有默认状态代码HttpStatusCode.OKHttpResponseMessage,因此最好您自己完成。

我的建议是不要从您的 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 始终是最佳实践?返回对象有什么问题?
  • @user1615362:即使你返回一个对象,它也会被框架自动包装在一个 HttpResponseMessage 中。通过作为 HttpResponseMessage 返回,您可以更好地控制 api 函数的响应,如果将来需要,您也可以轻松自定义响应
  • 不过,从类型安全的角度来看,最好返回一个“对象”。
  • 视情况而定,在更改 HttpStatucCode 时,您可能还希望返回不同类型的响应对象,例如包括“错误原因”属性。如果您想处理控制器中的错误情况,这似乎是要走的路。另请阅读来自 Microsoft 的 exception-handling
【解决方案2】:

您可以抛出 System.Web.Http.HttpResponseException,指定 HTTP 状态代码和/或可选地整个 HttpResponseMessage 返回给客户端。

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多