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

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

两种可能的方案;

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

      

第二 。 我不完全确定,但ASP.NET Web API 可能要求您开发自定义ActionFilter以正确地将exception转换为结果类型 。 这是我个人在Web API中进行error handling的方式:

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

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