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


171

我正在使用ASP.NET MVC 4 WebApi,并在IIS Express的本地计算机上运行它带来了很多乐趣。我已经将IIS Express配置为也可以为远程计算机提供服务,因此我公司中的其他公司都将我的计算机用作我们的Web服务器。

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

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

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


2
错误响应上的HTTP状态代码是什么?如果是500,则很有可能对于使用IIS 7的远程计算机而言,网站/应用程序配置无效。从您的计算机上打它,看它是否成功。
Sixto Saez,2012年

这是一个500错误。感谢您的建议,但是WebApi提供的默认index.html页面可以使用。还应该补充一点,一些API Web服务可以工作,而其他API则不能,而所有这些都可以在我的本地计算机上工作。
nsg 2012年

2
看到500错误时,您需要启用IIS请求跟踪以获取更多详细信息。Web API路由启动之前通常会发生500错误,但是我想它可能通过您的代码正在执行的操作来触发它。查看IIS跟踪日志记录,看看是否提供任何线索。
Sixto Saez 2012年

1
通过从服务器计算机本身上的浏览器发起请求(例如,使用远程桌面会话),您可能能够使服务器在响应中提供更多详细的错误信息。
乔恩·施耐德

Answers:


268

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

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


33
看起来,只要HTTP响应代码为500并且启用了自定义错误,WebAPI就会将{“ message”:“发生错误”}替换为真实响应。感谢您的指导。
Paul Suart

4
关于设置customErrors模式的好建议。我很惊讶这些更改会影响这些错误的输出。
Dewi Rees 2014年

1
您也可以将其设置为mode="RemoteOnly",如果您在服务器上的Web浏览器上运行页面,并且该站点的其余部分可以从外部访问
那么

关于在更改设置时如何获取此类错误详细信息的任何建议(例如,由于API部分托管在PCI兼容服务器上,因此在计算机级别禁用了错误)?我尝试设置Elmah,但不幸的是它没有记录任何内容。
RubyHaus

这是最好的方法,可以提供有关此类通用方法的足够信息。
DanielV

97

基本上:

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),Microsoft不再使用仅使用IIS的策略,而使用CustomErrors旧的IIS;)。

无论如何,我在生产上遇到了一个本地没有的问题。然后发现我无法像在开发计算机上那样在Chrome的“网络”标签中看到错误。最后,我设法通过在生产服务器上安装Chrome,然后浏览到服务器本身(例如在“ localhost”上)的应用程序来解决该问题。然后,堆栈跟踪和所有错误出现了更详细的错误。

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

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

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

注意:默认值是“ LocalOnly”,这说明了为什么找到这篇文章之前我能够按照我所描述的方式解决问题。但是我了解到,并不是每个人都可以远程生产和启动浏览器(我知道,直到我决定选择自由职业者和DevOps时,我大多数时候才能这样做)。


2
现在,这有效。谢谢!我有一些内存集成不足的测试,这些测试在构建服务器上失败,但在本地失败。在我的初学者课程中使用此设置,我可能有机会弄清楚原因。
Thomas Eyde

通过Microsoft.AspNet.WebApi.WebHost托管在IIS中时,customError设置似乎可以与WebApi 2一起使用。软件包的版本为5.2.3,因此ASP.NET堆栈的发行日期为2012年以后。通过将其设置为“关”,Web api将从通用错误切换为更详细的错误,包含调用堆栈,等等
汤姆

4
请谨慎设置,因为它可以向“黑客”泄露敏感信息。我经常会做一些简单的事情,例如if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }设置这样的选项。然后,我可以在生产中对其进行测试,明天,如果我忘记禁用它,它将神奇地恢复为正常行为。
Simon_Weaver

36

没有其他答案对我有用。

这样做:(在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上内部提供的应用程序的产品上起作用。
保罗·卡尔顿

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 帮助我发现我返回了由于上下文已被处理而无法解析的实体的实例,谢谢
Jood jindy

12

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

备查

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

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

11

发布到WebAPI端点时遇到类似的问题。通过关闭CustomErrors = Off,我可以看到缺少dll之一的实际错误。


10

如果这可以帮助任何人:

我遇到了类似的问题,并按照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文件移动到其他位置并忘记更改config中的connectionstrings节点的时候(connectionsstrings节点使用“ configSource”放置在单独的文件中,但这是另一回事)。


这是在将OData和AutoMapper添加到asp.net中的Web api时发生的-希望这些关键字可以帮助某人到达此职位,并且try / catch在我的情况下不起作用,所以我不得不看一下原始结果
Ekus

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/

在此处输入图片说明

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


0

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.