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

Gre*_*ter 26 asp.net iis asp.net-web-api

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

new HttpResponseMessage( HttpStatusCode.Created )
Run Code Online (Sandbox Code Playgroud)

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

new HttpResponseMessage<IEnumerable<string>>( usefulMessages, HttpStatusCode.BadRequest );
Run Code Online (Sandbox Code Playgroud)

问题是,当我向测试服务器发出导致错误的请求时,我收到了错误的请求代码,但我从未看到过这些消息.如果我向本地计算机发出完全相同的请求,我会看到消息.以下输出来自我自己的工具:

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

Status code: 400 (BadRequest)
Response data: ["Error message one", "Error message two"]
Run Code Online (Sandbox Code Playgroud)

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

Status code: 400 (BadRequest)
Response data: Bad Request
Run Code Online (Sandbox Code Playgroud)

正在运行的代码完全相同.数据库是一样的.除服务请求的服务器外,一切都是一样的.我甚至有代码通过电子邮件发送自己的错误消息,所以我知道服务器正在生成正确的错误消息并且行为正确.这可能是一个IIS的东西(比如customErrors = RemoteOnly for Web API)?不仅从响应数据中省略了错误消息,而且发生了短语"错误请求"而不是放在那里.

有任何想法吗?谢谢.

syn*_*ody 25

看一下HttpConfiguration.IncludesErrorDetailPolicy上的这篇MSDN帖子:

在你的Global.asax中:

var config = GlobalConfiguration.Configuration;
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
Run Code Online (Sandbox Code Playgroud)

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

  • 这似乎不起作用.而且,它似乎有点宽泛.看看我对杰森的问题的评论.此外,我在三天前留下了这个评论,当我今天回来时,评论不在这里,答案被(错误地)接受了.不确定发生了什么 - 抱歉. (2认同)

Hau*_*Haf 17

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

在真实的场景中,你肯定会想在你的应用程序中使用自定义错误页,但为了自定义异常的消息在的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>
Run Code Online (Sandbox Code Playgroud)

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


Jas*_*son 4

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

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

<system.web>
    <customErrors mode="Off" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

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