WebApi的{“消息”:“发生错误”}在IIS7上,而不是在IIS Express中

时间:2012-10-22 21:22:36

标签: iis-7 asp.net-mvc-4 asp.net-web-api

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

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

  

{" message":"发生错误"}

消息。任何人都知道可能会发生什么?

9 个答案:

答案 0 :(得分:246)

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

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

答案 1 :(得分:85)

基本上:

如果IncludeErrorDetailPolicy无法为您解决问题,请使用CustomErrors(例如,如果您的ASP.NET堆栈是&gt; 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

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

TL; DR版本

对我来说CustomErrors并没有真正帮助。它已设置为Off,但我仍然只收到一条微不足道的an error has occurred消息。我想接受的答案是从3年前开始的,现在网络词汇已经很久了。我正在使用Web API 2和ASP.NET 5(MVC 5),而Microsoft已经摆脱了仅限IIS的策略,而CustomErrors是旧的skool IIS;)。

无论如何,我在本地没有生产问题。然后发现我无法在我的开发机器上看到Chrome网络选项卡中的错误。最后,我设法通过在我的生产服务器上安装Chrome,然后在服务器本身上浏览应用程序(例如在'localhost'上)来解决它。然后,堆栈跟踪和所有错误都会出现更详细的错误。

之后我才发现this article from Jimmy Bogard(注意:吉米是mr. AutoMapper!)。有趣的是,他的文章也是从2012年开始,但在其中他已经解释CustomErrors对此不再有帮助,但你可以通过设置不同的{{1}来改变'错误细节'。在全局WebApi配置中(例如IncludeErrorDetailPolicy):

WebApiConfig.cs

幸运的是,他还解释了如何设置webapi(2)听取你的GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 设置。这是一个非常明智的方法,这可以让你回到2012年:P。

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

答案 2 :(得分:22)

其他答案都不适用于我。

这样做:(在Startup.cs中)

textview

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

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

        WebApiConfig.Register(config);

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

答案 3 :(得分:11)

发布到Web API端点时遇到了类似的问题。通过转动CustomErrors = Off,我能够看到实际的错误,其中一个dll丢失了。

答案 4 :(得分:9)

如果这有助于任何人:

我遇到了类似的问题,并按照Nates的说明添加了:

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

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

  

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

这是我记得我已经将edmx文件移动到其他位置而忘记更改配置中的连接线节点(connectionsstrings节点使用&#34; configSource&#34;放置在单独的文件中,但是这是另一个故事。)

答案 5 :(得分:8)

当我在测试环境中遇到错误时,我总是会遇到这个问题并记住,&#34;之前我已经完成了这个,但我可以直接在web.config中完成,而无需修改代码并重新部署到测试环境,但需要进行2次更改......又是什么?&#34;

供将来参考

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

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

答案 6 :(得分: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/

enter image description here

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

因此,我尝试了所有建议的解决方案,均无济于事。 我所做的只是设置从服务器运行应用程序,它完整显示了错误,当我将customErrors模式设置为false时,它应该已经起作用了,但是没有。从服务器浏览API的那一刻,我就能看到问题所在。