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

nsg*_*nsg 169 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":"发生了错误"}

信息.任何人都知道会发生什么事吗?

nsg*_*nsg 256

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

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

  • 看起来WebAPI会在HTTP响应代码为500并且自定义错误打开时用{"message":"发生错误"}替换实际响应.谢谢你的指针. (33认同)
  • 关于设置customErrors模式的好建议.我很惊讶改变了这些错误输出的影响. (4认同)

Bar*_*art 93

基本上:

IncludeErrorDetailPolicy,而是如果CustomErrors不为您解决(例如,如果你是ASP.NET堆栈> 2012):

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

注意:小心返回详细的错误信息可以向"黑客"泄露敏感信息.请参阅下面的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'上).然后堆栈跟踪和所有错误出现更详细的错误.

之后我才从Jimmy Bogard那里找到这篇文章(注意:Jimmy 先生AutoMapper先生!).有趣的是,他的文章也是从2012年开始的,但在其中他已经解释说CustomErrors这对此不再有帮助了,但你可以通过IncludeErrorDetailPolicy在全局WebApi配置中设置不同来改变'错误细节' (例如WebApiConfig.cs):

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

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

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

  • 小心设置这个因为它可以向"黑客"泄露敏感信息.我经常会做一些快速破解,例如`if(DateTime.Now <new DateTime(2017,6,22)){....}`来设置这样的选项.然后我可以在生产中测试它,如果我忘记禁用它,它将会神奇地恢复正常行为. (4认同)
  • 现在,这有效.谢谢!我有一些内存集成 - 所有类型的测试在构建服务器上失败,但不在本地.在我的初创班级中使用此设置,我可能有机会找出原因. (2认同)

sam*_*ric 30

没有其他答案对我有用.

这样做:(在Startup.cs中)

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

        WebApiConfig.Register(config);

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}
Run Code Online (Sandbox Code Playgroud)

(或者你可以把它放在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;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 11

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


Ric*_*los 10

当我在测试环境中遇到错误并且记得"我之前已经完成了这个,但我可以直接在web.config中完成此操作而无需修改代码并重新部署到测试环境时,我总是会遇到这个问题,但这需要2次改变......又是什么呢?"

备查

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

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)


hor*_*erg 9

如果这有助于任何人:

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

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

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

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

这是我记得我已经将edmx文件移动到另一个位置并且忘记更改配置中的连接字符串节点(connectionsstrings节点使用"configSource"放置在单独的文件中,但这是另一个故事).