web-dev-qa-db-fra.com

Le {"message": "une erreur s'est produite" de WebApi sur IIS7, pas dans IIS Express

Je travaille avec ASP.NET MVC 4 WebApi et je m'amuse beaucoup à l'exécuter sur mon ordinateur local sous IIS Express. J'ai configuré IIS Express pour qu'il puisse également desservir des machines distantes. D'autres sociétés de mon entreprise utilisent donc mon ordinateur comme serveur Web.

Après avoir décidé que cette solution n’était pas optimale, nous avons décidé de mettre WebApi sur un serveur distant après avoir installé .NET 4.5. Lorsque j’utilise fiddler et que j’envoie un POST à un contrôleur de mon ordinateur local, la réponse est correcte. Pourtant, lorsque je change de domaine pour le serveur Web exécutant IIS7, le même POST renvoie un message cryptique.

{"message": "une erreur s'est produite"}

message. Quelqu'un a une idée de ce qui pourrait se passer?

164
Nate

Le problème était une dépendance manquante qui n'était pas sur le serveur mais sur ma machine locale. Dans notre cas, il s’agissait d’une dll Devart.Data.Linq.

Pour obtenir cette réponse, j'ai activé IIS traçage de 500 erreurs. Cela donnait un peu d’informations, mais ce qui était vraiment utile, c’était dans web.config qui définissait le <system.web><customErrors mode="Off"/></system.web> Cela indiquait une dépendance manquante chargée dynamiquement. Après avoir ajouté cette dépendance et indiqué qu’elle devait être copiée localement, le serveur a commencé à fonctionner.

250
Nate

Fondamentalement:

Utilisez plutôt IncludeErrorDetailPolicy si CustomErrors ne le résout pas pour vous (par exemple, si votre pile ASP.NET est> 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Remarque: Soyez prudent lorsque vous renvoyez des informations d'erreur détaillées, car elles peuvent révéler des informations sensibles à des "hackers". Voir le commentaire de Simon sur cette réponse ci-dessous.

Version TL; DR

Pour moi, CustomErrors n'a pas vraiment aidé. Il était déjà réglé sur Off, mais je n'ai toujours reçu qu'un message déplorable an error has occurred. Je suppose que la réponse acceptée date d'il y a 3 ans, ce qui est une longue période dans le Web Word de nos jours. J'utilise Web API 2 et ASP.NET 5 (MVC 5) et Microsoft s'est éloigné de la stratégie IIS uniquement, alors que CustomErrors correspond à old skool IIS;).

Quoi qu'il en soit, j'avais un problème de production que je n'avais pas localement. Et puis j'ai constaté que je ne pouvais pas voir les erreurs dans l'onglet Réseau de Chrome comme sur mon ordinateur dev. À la fin, j’ai réussi à le résoudre en installant Chrome sur mon serveur de production, puis en naviguant vers l’application située sur le serveur lui-même (par exemple, sur "localhost"). Puis des erreurs plus détaillées sont apparues avec les traces de pile et tout.

Ce n’est que plus tard que j’ai trouvé cet article de Jimmy Bogard (Remarque: Jimmy est mr. AutoMapper! ). Ce qui est amusant, c’est que son article date également de 2012, mais il y explique déjà que CustomErrors n’aide plus, mais que vous POUVEZ changer le 'détail de l’erreur' en définissant un IncludeErrorDetailPolicy différent dans la configuration globale de WebApi (par exemple, WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Heureusement, il explique également comment configurer cela pour que webapi (2) écoute vos paramètres CustomErrors. C'est une approche assez judicieuse, et cela vous permet de remonter à 2012: P.

Remarque: la valeur par défaut est 'LocalOnly', ce qui explique pourquoi j'ai pu résoudre le problème de la manière que j'ai décrite avant de trouver ce message. Mais je comprends que tout le monde ne peut pas simplement se connecter à la production et au démarrage d’un navigateur (je sais que je ne le pouvais pas jusqu’à ce que je décide de devenir freelance AND DevOps).

90
Bart

Aucune des autres réponses n'a fonctionné pour moi.

Cela a: (dans Startup.cs)

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

        WebApiConfig.Register(config);

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

(ou vous pouvez le mettre dans 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;
    }
}
26
samneric

J'ai rencontré un problème similaire lors de la publication sur le noeud final de l'API Web. En tournant le paramètre CustomErrors = Off, j’ai pu voir l’erreur réelle qui était l’une des dll manquantes.

11
ctong

Si cela aide quelqu'un:

J'ai eu un problème similaire, et en suivant les instructions de Nates, j'ai ajouté:

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

Cela m'a montré plus d'informations sur l'erreur:

"ExceptionMessage": "Impossible de charger la ressource de métadonnées spécifiée.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "à System.Data.Entity.Core.Metadata.Edm.Metadata.MetadataArtifLoaderCompositeRoad .LoadResources (...

C'est à ce moment-là que je me suis rappelé que j'avais déplacé le fichier edmx vers un autre emplacement et que j'avais oublié de changer le nœud connectionstrings dans la configuration (le nœud connectionsstrings a été placé dans un fichier séparé à l'aide de "configSource", mais c'est une autre histoire).

9
hormberg

J'arrive toujours à cette question lorsque je rencontre une erreur dans l'environnement de test et me souviens: "Je l'ai déjà fait, mais je peux le faire directement dans le fichier web.config sans avoir à modifier le code et à le redéployer dans l'environnement de test." , mais il faut 2 changements ... qu'est-ce que c'était déjà? "

Pour référence future

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

ET

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

Mon fichier XML swagger n'a pas été déployé dans\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/

enter image description here

Il devait être défini dans la configuration de version ainsi que dans la configuration de débogage.

0
RaSor