71 votes

ASP.NET l'API Web: Non descriptif 500 Erreur Interne du Serveur

Comme le titre l'indique, j'ai 500 Erreur Interne au Serveur de requête GET à un IQueryable action. Le corps de l'erreur est vide. Cette erreur se produit après mon action renvoie le résultat.

J'utilise ASP.NET l'API Web de RC.

Comment puis-je obtenir trace de la pile de l'erreur?

58voto

Stever B Points 2657

Vous pouvez essayer d'ajouter:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
    IncludeErrorDetailPolicy.Always;

pour votre Application_Start() dans le monde.asax. Cette solution fonctionne pour de nombreuses erreurs courantes.

Si, toutefois, vous n'êtes pas d'obtenir des informations satisfaisantes, vous devriez envisager la rédaction d'un l Exception du Filtre et de l'inscrire dans le monde.

Cet article devrait vous obtenir a commencé. Le noyau de ce que vous avez besoin est à écrire et enregistrer quelque chose comme:

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

8voto

Kiran Challa Points 14141

Post RC, ce problème a été corrigé et vous obtiendrez le détail de l'erreur aussi en dehors de la 500 Erreur Interne du Serveur. (Ce problème est résolu pour le Web Hôte scénarios seulement si).

Vous pouvez faire ce qui suit pour obtenir les détails de l'exception qui pourrait être survenant au cours d'un formateur de méthodes writetostream méthode.

ObjectContent<IEnumerable<Product>> responseContent = new ObjectContent<IEnumerable<Product>>(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();

4voto

Blocka Points 95

Je suis tombé sur cette même question. J'ai trouvé Kiran Challa réponse utile dans l'obtention de l'exception d'être jeté en dehors de mon action.

Pour résoudre mon problème, le réglage de la propriété ProxyCreationEnabled la valeur de mon contexte false m'a fait un pas de plus.

Dans mon scénario, mon prochain exception est due à une référence circulaire dans mes modèles. Après le nettoyage, le fantôme de réponse de 500 a disparu. Bonne chance si vous n'avez pas résolu encore!

3voto

Simcha Khabinsky Points 708

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

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

Essayez d'ajouter le code suivant à la méthode Application_Start dans le monde.asax fichier:

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

1voto

Anders Points 141

J'ai l'habitude d'utiliser le Mondial.asax de rattraper toutes les erreurs. Voici une capture du 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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X