在Web API操作方法中抛出HttpResponseException,返回空200响应

时间:2012-09-04 09:17:35

标签: c# .net asp.net-web-api

我正在尝试从我的应用程序返回适当的Http代码和响应,但我正在努力。似乎有两种方法可以返回特定的http响应。

我想要解决的方法是抛出HttpResponseException

public Information Get(int apiKey)
{
    if (!_users.Authenticate(apiKey))
    {
        var response = new HttpResponseMessage();
        response.StatusCode = (HttpStatusCode)401;
        response.ReasonPhrase = "ApiKey invalid";

        throw new HttpResponseException(response);
    }

    return _info.Get();
}

然而,当我这样做时,我看到的响应只是一个空的200响应!

您似乎还可以更改操作方法的签名以返回HttpResponseMessage,如下所示:

public HttpResponseMessage Get()
{
    if (!_users.Authenticate(apiKey))
    {
        return Request.CreateResponse((HttpStatusCode) 401, "ApiKey invalid");
    }

    return Request.CreateResponse((HttpStatusCode) 200, _info.Get());
}

如果我可以提供帮助,我真的不想这样做,我宁愿把我的返回类型作为我想要检索的对象,而不是每次都在HttpResponseMessage包装它。

有没有理由为什么第一种方法返回空200而不是401我想要的消息?

2 个答案:

答案 0 :(得分:5)

两种可能的解决方案;

<强>第一即可。 Make sure your IIS is configured to let errors pass through

<configuration>
  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>
</configuration>

<强>第二即可。我不完全确定,但ASP.NET Web API may require you to develop a custom ActionFilter to properly translate Exceptions to result types。这是我个人在Web API中进行错误处理的方式:

  1. 允许在Web API中抛出任何类型的异常,就像在任何其他.NET应用程序中一样。
  2. 编写一个自定义ActionFilter,捕获异常并将其转换为适当的格式。例如,我以自定义JSON格式序列化所有异常。在客户端,我有一些自定义的AJAX技巧,可以根据这种格式处理错误(例如验证异常)。

答案 1 :(得分:1)

检查HttpConfiguration上的IncludeErrorDetailPolicy设置。默认情况下,策略是在本地访问Web API时显示错误详细信息。