6

我正在尝试从我的应用程序返回适当的 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 与我想要的消息是否有原因?

4

2 回答 2

5

两种可能的解决方案;

首先确保您的 IIS 配置为允许错误通过

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

第二。我不完全确定,但 ASP.NET Web API可能需要您开发自定义 ActionFilter 以正确地将 Exceptions 转换为 result types。这是我个人在 Web API 中进行错误处理的方式:

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

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

于 2012-09-04T19:03:35.910 回答