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

我正在使用ASP.NET MVC 4 WebApi,并且在IIS Express上的本地计算机上运行它很有趣。 我已经configuration了IIS Express来为远程机器提供服务,所以我公司的其他人也在使用我的电脑作为我们的networking服务器。

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

{“message”:“发生错误”}

信息。 任何人有任何想法可能会发生什么?

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

为了得到这个答案,我打开了500个错误的IIS跟踪。 这给了一点信息,但真正有用的是在web.config中设置<system.web><customErrors mode="Off"/></system.web>这指的是一个缺lessdynamic加载的依赖。 在添加这个依赖并且告诉它在本地复制之后,服务器开始工作。

基本上:

使用IncludeErrorDetailPolicy如果CustomErrors不能解决你的问题(例如,如果你的ASP.NET堆栈> 2012):

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

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

TL; DR版本

对于我CustomErrors并没有真正的帮助。 它已经设置为Off ,但我仍然只有一个可怕an error has occurred消息。 我猜接受的答案是3年前的,现在这个网站已经很长时间了。 我正在使用Web API 2和ASP.NET 5(MVC 5),微软已经摆脱了只有IIS的策略,而CustomErrors是旧的skool IIS;)。

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

之后我才从Jimmy Bogard那里find这篇文章 (注:Jimmy是AutoMapper先生! )。 有趣的是,他的文章也是从2012年开始的,但是他已经解释了CustomErrors对此没有帮助,但是您可以通过在全局WebApiconfiguration中设置不同的IncludeErrorDetailPolicy来更改“错误详细信息” WebApiConfig.cs ):

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

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

注意:默认值是“LocalOnly”,这就解释了为什么我能够按照我所描述的方式解决问题,然后才find这篇文章。 但我明白,并不是每个人都可以远程生产并启动一个浏览器(我知道我直到我决定去兼职和DevOps)。

发布到WebAPI端点时,我遇到了类似的问题。 通过打开CustomErrors = Off,我可以看到其中一个dll丢失的实际错误。

如果这有助于任何人:

我有一个类似的问题,并遵循Nates指示我补充说:

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

这显示了我对错误的更多信息:

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

这是当我记得我已经将edmx文件移动到不同的位置,并忘记更改configuration中的connectionstrings节点(connectionsstrings节点被放置在一个单独的文件使用“configSource”,但这是另一回事)。

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

备查

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

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

没有其他答案为我工作。

这样做:(在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; } }