首页 文章

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

提问于
浏览
150

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

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

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

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

6 回答

  • 79

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

  • 5

    如果这有助于任何人:

    我有一个类似的问题,并按照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文件移动到另一个位置而忘记更改配置中的连接线节点(connectionsstrings节点使用“configSource”放置在单独的文件中,但这是另一个故事) .

  • 236

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

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

  • 10

    基本上:

    如果 CustomErrors 没有't solve it for you (e.g. if you',则ASP.NET堆栈> 2012),请使用 IncludeErrorDetailPolicy

    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年开始的,但在其中他已经通过在全局WebApi配置中设置不同的 IncludeErrorDetailPolicy (例如 WebApiConfig.cs )来解释 CustomErrors 没有't help for this anymore, but that you CAN change the '错误细节:

    GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
    = IncludeErrorDetailPolicy.Always;
    

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

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

  • 8

    没有其他答案对我有用 .

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

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

    备查

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

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

相关问题