{“Message” de WebApi: “une erreur s’est produite”} sur IIS7, pas dans IIS Express

Je travaille avec ASP.NET MVC 4 WebApi et je m’amuse beaucoup avec son exécution sur mon ordinateur local sur IIS Express. J’ai configuré IIS Express pour servir également des ordinateurs distants. D’autres utilisateurs de mon entreprise utilisent 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 envoie un POST à ​​un contrôleur sur mon ordinateur local, il retourne la réponse correcte, mais lorsque je change le domaine sur le serveur Web exécutant IIS7, le même POST renvoie un message crypté.

{“message”: “une erreur est survenue”}

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

Le problème était une dépendance manquante qui ne se trouvait pas sur le serveur mais se trouvait sur ma machine locale. Dans notre cas, c’était un Devart.Data.Linq dll.

Pour arriver à cette réponse, j’ai activé le suivi IIS pour 500 erreurs. Cela donnait un peu d’information, mais la chose vraiment utile était dans le paramètre web.config le Cela indiquait une dépendance chargée dynamicment manquante . Après avoir ajouté cette dépendance et lui avoir dit de la copier localement, le serveur a commencé à fonctionner.

Fondamentalement:

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

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

Remarque: veillez à ce que les informations détaillées sur les erreurs puissent révéler des informations sensibles à des “pirates”. 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 ( Off , mais je n’ai toujours reçu qu’un message an error has occurred . Je suppose que la réponse acceptée date d’il ya trois ans, ce qui représente une longue période sur le Web. J’utilise Web API 2 et ASP.NET 5 (MVC 5) et Microsoft s’est éloigné d’une stratégie CustomErrors uniquement sur IIS, alors que CustomErrors est l’ancien IIS CustomErrors ;).

En tout cas, 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 ma machine de développement. En fin de compte, j’ai réussi à le résoudre en installant Chrome sur mon serveur de production, puis en y naviguant sur le serveur lui-même (par exemple, sur «localhost»). Ensuite, des erreurs plus détaillées sont apparues avec les traces de stack et tout.

Seulement après j’ai trouvé cet article de Jimmy Bogard (Note: Jimmy est m. AutoMapper! ). Ce qui est amusant, c’est que son article date également de 2012, mais il explique déjà que CustomErrors ne l’aide plus, mais que vous POUVEZ changer le “Error error” en définissant un IncludeErrorDetailPolicy différent dans la configuration WebApi globale (par exemple WebApiConfig.cs ):

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

Heureusement, il explique également comment configurer Webapi (2) pour écouter vos parameters CustomErrors . C’est une approche plutôt judicieuse, et cela vous permet de revenir en 2012: P.

Note: La valeur par défaut est “LocalOnly”, ce qui explique pourquoi j’ai pu résoudre le problème comme je l’ai décrit, avant de trouver cet article. Mais je comprends que tout le monde ne peut pas se contenter de mettre en production et de démarrer un navigateur (je sais que je ne le pouvais pas avant que je ne décide de devenir pigiste ET DevOps).

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

Cela a fait: (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.MapHttpAtsortingbuteRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); // Here: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; } } 

J’ai eu un problème similaire lors de la publication sur le noeud final WebAPI. En tournant les CustomErrors = Off, j’ai pu voir que l’erreur réelle qui est l’une des DLL manquait.

Au cas où cela aiderait quelqu’un:

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

    

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”: “sur System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource .LoadResources (…

C’est à ce moment que je me suis souvenu que j’avais déplacé le fichier edmx vers un autre emplacement et que j’avais oublié de changer le nœud connectionssortingngs dans la configuration (le nœud connectionsssortingngs était placé dans un fichier séparé en utilisant “configSource”, mais c’est une autre histoire).

J’arrive toujours à cette question quand je rencontre une erreur dans l’environnement de test et souviens-toi: “Je l’ai déjà fait auparavant, mais je peux le faire directement dans 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 encore? ”

Pour référence future

    

ET