28

我有一个 Web API 控制器 POST 方法,它在本地和测试服务器上表现良好。如果一切顺利,它会返回:

new HttpResponseMessage( HttpStatusCode.Created )

如果出现问题,它会返回:

new HttpResponseMessage<IEnumerable<string>>( usefulMessages, HttpStatusCode.BadRequest );

问题是当我向测试服务器发出一个导致错误的请求时,我得到了错误的请求代码,但我从来没有看到这些消息。如果我向本地机器发出完全相同的请求,我确实会看到这些消息。以下输出来自我自己的工具:

向我的本地机器发送请求,我得到:

Status code: 400 (BadRequest)
Response data: ["Error message one", "Error message two"]

向我得到的测试服务器发送请求:

Status code: 400 (BadRequest)
Response data: Bad Request

正在运行的代码完全相同。数据库是一样的。除了为请求提供服务的服务器之外,一切都相同。我什至有代码通过电子邮件向自己发送错误消息,因此我知道服务器正在生成正确的错误消息并且行为正确。这可能是 IIS 的事情(就像 customErrors = RemoteOnly for Web API 的等价物)?不仅响应数据中省略了错误消息,而且还发明了短语“Bad Request”来代替。

有任何想法吗?谢谢。

4

5 回答 5

29

看看这个关于 HttpConfiguration.IncludesErrorDetailPolicy 的MSDN 帖子:

在您的 Global.asax 中:

var config = GlobalConfiguration.Configuration;
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

我已使用此配置属性强制错误消息包含详细信息。

于 2012-05-03T17:46:19.027 回答
18

有同样的问题。这确实是因为自定义错误设置。

在现实世界的场景中,您肯定希望在应用程序中使用自定义错误页面,但为了让自定义异常消息在 WebAPI 中正常工作,您需要禁用自定义错误页面。

如何解决这个问题?幸运的是,您可以使用<location>web.config 中的元素来解决这个问题。

解决方案:

  <!-- General for the application -->
  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="YourCustomErrorPage.aspx"/>
  </system.web>

  <!-- Override it for paths starting with api (your WebAPI) -->
  <location path="api">
     <system.web>
        <customErrors mode="Off" />
     </system.web>
  </location>

我在自己的应用程序中使用此方法,效果很好。

于 2014-05-12T13:50:29.393 回答
4

对我来说,这听起来很可能是您的 customErrors 模式。WebAPI 在 ASP.NET (MVC) 之上运行,因此它使用所有相同的 web.config 设置。

如果是测试服务器,你可以尝试关闭 customErrors 来验证。

<system.web>
    <customErrors mode="Off" />
</system.web>
于 2012-04-24T17:52:35.810 回答
3

欧文

由于这里没有提到主机选择,我只想补充一点,在 OWIN 的情况下,您必须使用 syneptody 的解决方案,但不能在 Global.asax 中,根据这个答案和我自己的测试。

您要IncludeErrorDetailPolicy.AlwaysStartup.cs文件中插入:

public void Configuration(IAppBuilder appBuilder)
{
    HttpConfiguration Config = new HttpConfiguration(); 
    Config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    ...
}
于 2019-01-25T11:41:58.030 回答
1

自测试版以来,Web API 代码库发生了许多变化。很多精彩。查看如何在此处获取每晚签名的版本。

HttpResponseMessage<T>不再支持泛型。使用HttpRequestMessage.CreateResponse<T>. 看到这个这个

如果您打算继续使用它,您将希望至少更新到当前的夜间版本,而不是使用测试版。有很多好的改进,特别是对于 Web API。

编辑:在我看来,这实际上与您最初的问题有关,因为虽然我没有调查具体答案,但似乎较新的东西返回的响应不会被 IIS 拦截。它可能与重新处理错误处理/错误报告有关。

更新 8/14/2012当前 MVC 4 / Web API 的候选版本已经足够好了。除非您想完全保持最新状态,否则您不再需要每晚构建。

于 2012-05-15T14:15:20.933 回答