ChatGPT解决这个技术问题 Extra ChatGPT

WebApi 的 {"message":"an error has occurred"} 在 IIS7 上,不在 IIS Express 上

我正在使用 ASP.NET MVC 4 WebApi,并且在我的本地计算机上的 IIS Express 上运行它很有趣。我也将 IIS Express 配置为为远程计算机提供服务,因此我公司中的其他人将我的计算机用作我们的网络服务器。

在确定这是一个不太理想的解决方案后,我们决定在安装 .NET 4.5 后将 WebApi 放在远程服务器上。当我使用提琴手并将 POST 发送到本地计算机上的控制器时,它返回正确的响应,但是当我将域更改为运行 IIS7 的网络服务器时,相同的 POST 返回一个神秘的

{“消息”:“发生错误”}

信息。有人知道会发生什么吗?

错误响应中的 HTTP 状态代码是什么?如果是 500,则很可能网站/应用程序配置对于具有 IIS 7 的远程计算机无效。在远程计算机上创建一个简单的 HTML 文件,如果可能,在远程计算机上浏览它以确保可以查看它,然后尝试从你的机器上打它,看看它是否成功。
这是一个 500 错误。感谢您的建议,但 WebApi 提供的默认 index.html 页面有效。还应该补充一点,一些 API 网络服务可以工作,而另一些则不能,而它们都可以在我的本地机器上工作。
当您看到 500 错误时,您需要启用 IIS request tracing 以获得更多细节。 500 错误通常发生在 Web API 路由启动之前,但我猜它可能会通过您的代码正在执行的操作来触发它。查看 IIS 跟踪日志,看看是否提供任何线索。
通过从服务器机器本身的浏览器发起请求(例如,使用远程桌面会话),您可能能够让服务器在其响应中为您提供更详细的错误信息。

L
Liam Laverty

问题是缺少不在服务器上但在我的本地计算机上的依赖项。在我们的例子中,它是一个 Devart.Data.Linq dll。

为了得到这个答案,我打开了 IIS 跟踪 500 错误。这提供了一些信息,但真正有用的是在 web.config 中设置 <system.web><customErrors mode="Off"/></system.web> 这表明缺少动态加载的依赖项。添加此依赖项并告知将其复制到本地后,服务器开始工作。


看起来,只要 HTTP 响应代码为 500 并且自定义错误开启,WebAPI 就会用 {"message":"an error has occurred"} 替换真实响应。感谢您的指点。
关于设置 customErrors 模式的好建议。我很惊讶改变对这类错误的输出产生了影响。
您也可以将其设置为 mode="RemoteOnly",如果您在服务器上的网络浏览器上运行该页面,如果该站点的其余部分可从外部访问,您也会看到错误而不会影响安全性
关于如何在无法更改该设置时获取此类错误详细信息的任何建议(例如,由于 API 部分托管在与 PCI 兼容的服务器上,因此在机器级别禁用了错误)?我尝试设置 Elmah,但不幸的是它没有记录任何内容。
这是最好的方法,提供了关于这种通用方法的足够信息。
c
commadelimited

基本上:

如果 CustomErrors 不能为您解决问题,请改用 IncludeErrorDetailPolicy(例如,如果您的 ASP.NET 堆栈大于 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

注意:小心返回详细的错误信息可能会向“黑客”泄露敏感信息。请参阅下面西蒙对此答案的评论。

TL;DR 版本

对我来说 CustomErrors 并没有真正帮助。它已经设置为 Off,但我仍然只收到一条微不足道的 an error has occurred 消息。我想公认的答案是从 3 年前开始的,这在如今的网络词中已经很长时间了。我正在使用 Web API 2 和 ASP.NET 5 (MVC 5),微软已经放弃了仅 IIS 的策略,而 CustomErrors 是旧的 skool IIS ;)。

无论如何,我对本地没有的产品有疑问。然后发现我在 Chrome 的网络选项卡中看不到错误,就像在我的开发机器上一样。最后,我设法通过在我的生产服务器上安装 Chrome,然后在服务器本身上浏览到应用程序(例如在“本地主机”上)来解决它。然后更详细的错误出现在堆栈跟踪和所有内容中。

之后我才找到 this article from Jimmy Bogard(注意:Jimmy 是 mr. AutoMapper!)。有趣的是,他的文章也是 2012 年的,但在其中,他已经解释说 CustomErrors 不再对此有帮助,但您可以通过在全局 WebApi 配置(例如 WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

幸运的是,他还解释了如何设置 Web API (2) 会监听您的 CustomErrors 设置。这是一个非常明智的方法,这可以让你回到 2012 年:P。

注意:默认值为'LocalOnly',这解释了为什么我能够在找到这篇文章之前按照我描述的方式解决问题。但我知道并不是每个人都可以远程生产和启动浏览器(我知道在我决定成为自由职业者和 DevOps 之前,我大多不能)。


现在,这行得通。谢谢!我有一些内存集成 owin 类型的测试在构建服务器上失败,但不是在本地。在我的创业课程中使用这个设置,我可能有机会找出原因。
当通过 Microsoft.AspNet.WebApi.WebHost 在 IIS 中托管时,customError 设置似乎适用于 WebApi 2。这些包的版本是 5.2.3,因此 ASP.NET 堆栈超过 2012 年。通过将其设置为 Off,Web api 从一般错误切换到更详细的错误,包含调用堆栈等...
请谨慎设置,因为它可能会向“黑客”泄露敏感信息。我会经常做一个像 if (DateTime.Now < new DateTime(2017, 6, 22)) { .... } 这样的快速破解来设置这样的选项。然后我可以在生产中测试它,如果我忘记禁用它,明天它会神奇地恢复到正常行为。
这里也有一篇很好的文章:lostechies.com/jimmybogard/2012/04/18/…
s
samneric

其他答案都不适合我。

这样做了:(在 Startup.cs 中)

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        WebApiConfig.Register(config);

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

(或者你可以把它放在 WebApiConfig.cs 中):

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

是的!这是我在 Mono/Linux 上唯一可行的解决方案。
这对我在 IIS 和 Windows Server 上的内部服务应用程序的 prod 有效。
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;帮助我发现我返回了一个无法解析的实体实例,因为上下文已被处理,谢谢
R
Rick Glos

当我在测试环境中遇到错误时,我总是会遇到这个问题并记住,“我以前做过,但是我可以直接在 web.config 中进行操作,而无需修改代码并重新部署到测试环境,但需要进行 2 次更改……又是什么?”

备查

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

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>

B
Bernard Vander Beken

如果这对任何人都有帮助:

我有一个类似的问题,并按照我添加的 Nates 说明:

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

这向我展示了有关该错误的更多信息:

“ExceptionMessage”:“无法加载指定的元数据资源。”,“ExceptionType”:“System.Data.Entity.Core.MetadataException”,“StackTrace”:“在 System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource .LoadResources(...

这是当我记得我已将 edmx 文件移动到其他位置并且忘记更改配置中的连接字符串节点时(连接字符串节点使用“configSource”放置在单独的文件中,但这是另一回事)。


当我在 asp.net 中将 OData 和 AutoMapper 添加到 web api 时,这发生在我身上——希望这些关键字可以帮助某人到达这篇文章,并且 try/catch 在我的情况下不起作用,所以我不得不查看原始结果
c
ctong

发布到 WebAPI 端点时,我遇到了类似的问题。通过打开 CustomErrors=Off,我能够看到缺少 dll 之一的实际错误。


R
RaSor

我的招摇 XML 文件没有部署到 \bin:

GlobalConfiguration.Configuration
  .EnableSwagger(c =>
  {
    c.SingleApiVersion("v1", "SwaggerDemoApi");
    c.IncludeXmlComments(string.Format(@"{0}\bin\SwaggerDemoApi.XML", 
                         System.AppDomain.CurrentDomain.BaseDirectory));
    c.DescribeAllEnumsAsStrings();
  })

http://wmpratt.com/swagger-and-asp-net-web-api-part-1/

https://i.stack.imgur.com/l7IXy.png

它必须在发布配置和调试配置中进行设置。


E
Eric H

如果您的 .NET Framework 的 machine.config 中有 <deployment retail="true"/>,您将不会看到详细的错误消息。确保该设置为假或不存在。


P
Prince Tegaton

所以我尝试了所有建议的解决方案都无济于事。我所做的只是设置从服务器运行应用程序并完整显示错误,当我将 customErrors 模式设置为 false 时这应该可以工作,但它没有。当我浏览服务器的 API 表单时,我就发现了问题。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅