在非开发环境中省略了从Web API方法返回的错误消息

时间:2012-04-20 13:11:46

标签: asp.net iis asp.net-web-api

我有一个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)?不仅从响应数据中省略了错误消息,还发生了一个短语“错误请求”而不是放在那里。

有什么想法吗?感谢。

5 个答案:

答案 0 :(得分:23)

在HttpConfiguration.IncludesErrorDetailPolicy上查看this MSDN post

在你的Global.asax中:

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

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

答案 1 :(得分:16)

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

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

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

解决方案:

  <!-- 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>

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

答案 2 :(得分:3)

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

如果是测试服务器,您可以尝试关闭customErrors以进行验证。

<system.web>
    <customErrors mode="Off" />
</system.web>

答案 3 :(得分:1)

自测试版以来,Web API代码库发生了很多变化。很多很棒的。了解如何获取每晚签名的版本here

不再支持通用HttpResponseMessage<T>。使用HttpRequestMessage.CreateResponse<T>。请参阅thisthis

如果您计划继续使用测试版,那么您至少需要更新到当前的每晚版本,而不是使用测试版。如此多的改进,特别是对于Web API。

编辑:在我看来,这实际上与你原来的问题有关,因为虽然我没有深入研究具体的答案,但是似乎新的东西会返回不具备的答案。被IIS拦截。它可能与错误处理/错误报告的重新处理有关。

UPDATE 8/14/2012 当前的MVC 4 / Web API候选发布版已经足够了。除非你想完全保持最新状态,否则你不需要再进行夜间建造。

答案 4 :(得分:1)

OWIN

由于此处未提及主机选择,因此我想补充一下,根据this answer和我自己的测试,在OWIN的情况下,您必须使用Global.asax中未使用的Syneptody解决方案BUT。

您要在IncludeErrorDetailPolicy.Always文件中插入Startup.cs

public void Configuration(IAppBuilder appBuilder)
{
    HttpConfiguration Config = new HttpConfiguration(); 
    Config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    ...
}