API Web ASP.NET: erreur de serveur interne 500 non descriptive

Comme le titre l’indique, j’ai une erreur de serveur interne de 500 à partir de la requête GET vers une action IQueryable. Le corps de l’erreur est vide. Cette erreur se produit après le résultat de mon action.

J’utilise ASP.NET Web API RC.

Comment puis-je obtenir la trace de la stack de cette erreur?

Post RC, ce problème a été résolu et vous obtiendrez également des détails d’erreur, à l’exception de l’erreur 500 Internal Server Error. (Ce problème est résolu uniquement pour les scénarios Web Host).

Vous pouvez effectuer les opérations suivantes pour obtenir les détails de l’exception réelle susceptible de se produire pendant la méthode WriteToStream d’un formateur.

ObjectContent> responseContent = new ObjectContent>(db.Products.Include(p => p.ProductSubcategory).AsEnumerable(), new XmlMediaTypeFormatter()); // change the formatters accordingly MemoryStream ms = new MemoryStream(); // This line would cause the formatter's WriteToStream method to be invoked. // Any exceptions during WriteToStream would be thrown as part of this call responseContent.CopyToAsync(ms).Wait(); 

Vous pouvez essayer d’append:

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

à votre Application_Start() dans le Global.asax. Cette solution fonctionne pour la plupart des erreurs courantes.

Si, toutefois, vous n’obtenez pas d’informations satisfaisantes, vous devriez envisager d’écrire un filtre d’exception et de l’enregistrer globalement.

Cet article devrait vous aider à démarrer. L’essentiel est d’écrire et d’enregistrer quelque chose comme:

 public class NotImplExceptionFilter : ExceptionFilterAtsortingbute { public override void OnException(HttpActionExecutedContext context) { if (context.Exception is NotImplementedException) { context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); } } } 

J’ai rencontré ce même problème. J’ai trouvé la réponse de Kiran Challa utile pour que l’exception réelle soit lancée en dehors de mon action.

Pour résoudre mon problème, définir la propriété ProxyCreationEnabled de mon contexte sur false m’a permis de franchir une étape supplémentaire.

Dans mon scénario, ma prochaine exception était due à une référence circulaire dans mes modèles. Après le nettoyage, la réponse fantôme 500 a disparu. Bonne chance si vous n’avez pas encore résolu ce problème!

Cela peut être lié à une référence circulaire.

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#handling_circular_object_references

Essayez d’append le code suivant à la méthode Application_Start dans le fichier Global.asax:

  var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All; 

Une faiblesse de routage trompeusement simple a causé ce problème dans mon cas: Il y avait un autre HttpPost avec la même signature (pas le nom) dans mon contrôleur Api. Le routage par défaut n’a pas résolu les différences de nom et le ServiceError 500 était la réponse donnée avant que l’une des fonctions Api ne soit atteinte. Solution: modifiez le routage par défaut ou vos signatures et réessayez.

Voici mon RouteConfig.cs qui fonctionne assez bien pour une utilisation standard de WebApi2:

  public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // Default is required in any case. routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } 

J’ai eu le problème dans RC quand je ne spécifiais pas les parameters de requête dans le bon ordre. Par exemple, si vous spécifiez $skip=0 , il obtiendra 500, mais si vous spécifiez $orderby=xxx&skip=0 aucune erreur.

J’utilise généralement le Global.asax pour détecter toutes les erreurs. Voici un code que vous pouvez utiliser

 public void Application_Error(object sender, EventArgs e) { Exception exc = Server.GetLastError(); MvcApplication mvcApplication = sender as MvcApplication; HttpRequest request = null; if (mvcApplication != null) request = mvcApplication.Request; } 

J’avais le même problème, mais la source était légèrement différente: j’ai défini la stratégie CORS manière incorrecte et cela m’a donné une 500 Internal server error , mais CORS ne fonctionnant pas, l’en Access-Control-Allow-Origin tête Access-Control-Allow-Origin n’était pas présenté. réponse et navigateur ne peuvent pas lire la réponse réelle

Je l’ai résolu avec l’option ChromeDevTools Copy as cURL qui me permet de voir la réponse et de comprendre la source de l’erreur

Fredrik Normén a écrit un excellent article de blog intitulé Traitement des exceptions API Web ASP.NET sur ce sujet. Sa solution utilise des classes d’exception personnalisées et un atsortingbut de filtre d’exception pouvant être appliqué à toutes les méthodes d’action d’ ApiController .

Ce scénario a été causé pour les raisons suivantes

  1. Le problème est survenu à cause de Web.config mal formé. (ConfigSections multiples)

  2. Au lieu de créer un dossier roslyn dans le dossier bin , je l’avais créé à la racine. (Emplacement de déploiement.)

La meilleure façon de diagnostiquer cela était de mettre une page HTML simple à l’emplacement de l’application et d’essayer de la parcourir. 500 La description de l’erreur sera affichée sur cette page HTML.

Et n’oubliez pas d’append

à Web.config