WebApi's {“message”:“an error has occurred”} on IIS7, not in IIS Express

后端 未结 9 1890
滥情空心
滥情空心 2020-12-12 10:36

I\'m working with ASP.NET MVC 4 WebApi and am having a lot of fun with it running it on my local computer on IIS Express. I\'ve configured IIS Express to serve remote machi

相关标签:
9条回答
  • 2020-12-12 11:09

    My swagger XML file was not deployed into \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/

    It had to be set in the Release Configuration as well as in the Debug Configuration.

    0 讨论(0)
  • 2020-12-12 11:12

    So i tried all the suggested solutions to no avail. All i did was to set run the app from the server and it displayed the error in full, this should have worked when i set customErrors mode to false but it didn't. The moment i browsed the API form the server i was able to see the problem.

    0 讨论(0)
  • 2020-12-12 11:14

    In case this helps anyone:

    I had a similar issue, and following Nates instructions I added:

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

    This showed me more information about the error:

    "ExceptionMessage": "Unable to load the specified metadata resource.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": " at System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(...

    This is when I remembered that I had moved the edmx file to a different location and had forgotten to change the connectionstrings node in the config (connectionsstrings node was placed in a seperate file using "configSource", but that's another story).

    0 讨论(0)
  • 2020-12-12 11:16

    I always come to this question when I hit an error in the test environment and remember, "I've done this before, but I can do it straight in the web.config without having to modify code and re-deploy to the test environment, but it takes 2 changes... what was it again?"

    For future reference

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

    AND

    <system.webServer>
      <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
    </system.webServer>
    
    0 讨论(0)
  • 2020-12-12 11:17

    Basically:

    Use IncludeErrorDetailPolicy instead if CustomErrors doesn't solve it for you (e.g. if you're ASP.NET stack is >2012):

    GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
    = IncludeErrorDetailPolicy.Always;
    

    Note: Be careful returning detailed error info can reveal sensitive information to 'hackers'. See Simon's comment on this answer below.

    TL;DR version

    For me CustomErrors didn't really help. It was already set to Off, but I still only got a measly an error has occurred message. I guess the accepted answer is from 3 years ago which is a long time in the web word nowadays. I'm using Web API 2 and ASP.NET 5 (MVC 5) and Microsoft has moved away from an IIS-only strategy, while CustomErrors is old skool IIS ;).

    Anyway, I had an issue on production that I didn't have locally. And then found I couldn't see the errors in Chrome's Network tab like I could on my dev machine. In the end I managed to solve it by installing Chrome on my production server and then browsing to the app there on the server itself (e.g. on 'localhost'). Then more detailed errors appeared with stack traces and all.

    Only afterwards I found this article from Jimmy Bogard (Note: Jimmy is mr. AutoMapper!). The funny thing is that his article is also from 2012, but in it he already explains that CustomErrors doesn't help for this anymore, but that you CAN change the 'Error detail' by setting a different IncludeErrorDetailPolicy in the global WebApi configuration (e.g. WebApiConfig.cs):

    GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
    = IncludeErrorDetailPolicy.Always;
    

    Luckily he also explains how to set it up that webapi (2) DOES listen to your CustomErrors settings. That's a pretty sensible approach, and this allows you to go back to 2012 :P.

    Note: The default value is 'LocalOnly', which explains why I was able to solve the problem the way I described, before finding this post. But I understand that not everybody can just remote to production and startup a browser (I know I mostly couldn't until I decided to go freelance AND DevOps).

    0 讨论(0)
  • 2020-12-12 11:19

    The problem was a missing dependency that wasn't on the server but was on my local machine. In our case, it was a Devart.Data.Linq dll.

    To get to that answer, I turned on IIS tracing for 500 errors. That gave a little bit of information, but the really helpful thing was in the web.config setting the <system.web><customErrors mode="Off"/></system.web> This pointed to a missing dynamically-loaded dependency. After adding this dependency and telling it to be copied locally, the server started working.

    0 讨论(0)
提交回复
热议问题