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

Posted

技术标签:

【中文标题】从 Web API 方法返回的错误消息在非开发环境中被省略【英文标题】:Error messages returned from Web API method are omitted in non-dev environment 【发布时间】:2012-05-02 01:56:52 【问题描述】:

我有一个 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”来代替。

有什么想法吗?谢谢。

【问题讨论】:

【参考方案1】:

欧文

由于此处未提及主机选择,我只想补充一点,根据this answer 和我自己的测试,如果是 OWIN,您必须使用 syneptody 的解决方案,但不能在 Global.asax 中使用。

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

public void Configuration(IAppBuilder appBuilder)

    HttpConfiguration Config = new HttpConfiguration(); 
    Config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    ...

【讨论】:

【参考方案2】:

看看this MSDN post上的HttpConfiguration.IncludesErrorDetailPolicy:

在您的 Global.asax 中:

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

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

【讨论】:

这似乎不起作用。此外,它似乎有点宽泛。请参阅我对杰森问题的评论。另外,我三天前留下了这条评论,今天我回来时评论不在这里,答案被(错误地)接受了。不知道发生了什么 - 对此感到抱歉。【参考方案3】:

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

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

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

解决方案:

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

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

【讨论】:

【参考方案4】:

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

不再支持通用 HttpResponseMessage&lt;T&gt;。使用HttpRequestMessage.CreateResponse&lt;T&gt;。请参阅this 和this。

如果您打算继续使用测试版,则至少需要更新到当前的夜间版本,而不是使用测试版。很多很好的改进,尤其是对于 Web API。

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

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

这似乎不起作用。如果是这样,它会产生一个新问题:“为什么我必须让我的网页用户看到带有堆栈跟踪的黄色服务器错误页面才能提供信息丰富的 Web 服务响应?”。

以上是关于从 Web API 方法返回的错误消息在非开发环境中被省略的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net web api 中返回 json 错误消息?

在 Spring Boot 中使用 Web Client Mono 获取 API 响应错误消息

如何在 dotnet core Web Api 中返回自定义错误消息

如何在 Web API Post 方法中返回自定义消息

从 MVC 4 Web Api 返回匿名类型失败并出现序列化错误

Spotify web api 在获取播放列表请求时返回状态 500