185

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

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

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

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

4

9 回答 9

292

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

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

于 2012-10-24T03:37:56.923 回答
104

基本上:

IncludeErrorDetailPolicy如果CustomErrors不能为您解决问题,请改用(例如,如果您的 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,然后在服务器本身上浏览到应用程序(例如,在“本地主机”上)来解决它。然后更详细的错误出现在堆栈跟踪和所有内容中。

后来才发现这篇来自 Jimmy Bogard 的文章(注:Jimmy 是AutoMapper 先生!)。有趣的是,他的文章也来自 2012 年,但在其中他已经解释说CustomErrors这不再有帮助,但是您可以通过IncludeErrorDetailPolicy在全局 WebApi 配置中设置不同的值来更改“错误详细信息”(例如WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

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

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

于 2015-11-20T20:01:00.460 回答
40

其他答案都不适合我。

这样做了:(在 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;
    }
}
于 2017-10-25T23:39:39.327 回答
15

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

备查

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

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>
于 2017-02-06T21:34:58.627 回答
12

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

于 2013-05-15T07:25:17.350 回答
12

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

我有一个类似的问题,并按照我添加的 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”放置在单独的文件中,但这是另一回事)。

于 2017-05-19T08:25:40.667 回答
0

我的招摇 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/

在此处输入图像描述

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

于 2019-04-26T06:28:15.097 回答
0

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

于 2020-01-16T21:54:06.977 回答
0

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

于 2020-03-30T09:52:22.457 回答