2017-02-16 3 views
0

J'ai un projet API Web MVC que je travaille. J'ai créé un contrôleur avec une action. Je suis capable de frapper l'action correctement en utilisant Postman, mais quand un système externe essaie d'atteindre mon contrôleur, il obtient une erreur de 500. Le propriétaire du service externe ne peut pas me donner plus de détails, il ne peut que réessayer la demande.Comment mieux résoudre ce 500 Erreur dans MVC API Web

Voici une des entrées du journal de leurs demandes dans IIS log

#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken 
2017-02-15 20:38:58 192.168.2.34 POST /Route/to/actionName 8002 - 192.168.2.37 Apache-HttpClient/4.5.2+(Java/1.8.0_102) - 500 0 0 146 

D'abord, je pensais peut-être l'action est frappé, alors j'ai ajouté un gestionnaire d'exception et l'exploitation forestière ajouté.

[Route("actionName")] 
[HttpPost] 
public IHttpActionResult actionName(MessageModel message) 
{ 
try 
{ 
    // code to handle the action 
} 
catch (Exception e) 
{ 
    // Code to log exception in the log file 
} 
} 

Essayé ci-dessus et ne vit rien dans le journal, je l'ai d'exécuter des tests des demandes ayant échoué pour vous assurer que les journaux de gestionnaire d'exceptions ci-dessus et il le fait.

Donc, la prochaine chose que j'ai décidé de faire était de gérer les erreurs au niveau des applications dans Global.asax et connectez-vous y exception.

protected void Application_Error(object sender, EventArgs e) 
{ 
    if (Request.HttpMethod == "POST") 
    { 
     var request = SomeMethodToReadRequestContentsInString(); 

     var service = new SomeExceptionLoggingService(); 

     var exception = Server.GetLastError(); 
     if (exception == null) 
     { 
      exception = new ApplicationException("Unknown error occurred"); 
     } 
     service.LogException(exception, Request.UserHostAddress, Request.UserAgent, request); 
    } 
} 

Et à ma grande surprise, rien dans le fichier journal.

Alors j'ai décidé d'enregistrer les demandes et tous les post voir si j'enregistrer quelque chose dans le journal.

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Request.HttpMethod == "POST") 
    { 
     var request = Helper.ReadStreamUnknownEncoding(Request.InputStream); 

     var service = new InterfaceTestingService(); 

     var exception = Server.GetLastError(); 
     if (exception == null) 
     { 
      exception = new ApplicationException("No Error in this request"); 
     } 
     service.LogException(exception, Request.UserHostAddress, Request.UserAgent, request); 
    } 
} 

Et encore, rien!

Comment puis-je attraper ce bug? Mon but est de voir le Content-Type, et le contenu.

J'ai essayé d'ajouter un Custom Field dans les paramètres du journal IIS pour inclure `Content-Type ', mais les fichiers journaux n'en ont toujours pas.

enter image description here

+0

Activer le débogage sur votre serveur, vous obtiendrez l'erreur réelle et non la page d'erreur générique ... juste assurez-vous que vous le désactiver car il est un énorme risque de sécurité. – BillRuhl

+0

@BillRuhl L'appelant ne peut pas m'offrir plus d'informations au-delà du code d'état HTTP retourné (oui c'est bête). Qui plus est befuddling est pourquoi je ne suis pas capable de l'attraper dans les gestionnaires asax mondiaux. – fahadash

+0

Eh bien, je pense qu'ils ont à peu près * avoir * pour vous donner plus d'informations. Naturellement, ils peuvent seulement obtenir ce que votre serveur renvoie en termes d'erreur réelle, mais ils ont plus d'informations qui peuvent vous aider à résoudre les problèmes, à savoir: l'URI, la méthode de requête et le corps de la requête. Étant donné que vous n'enregistrez que les messages POST et que vous n'obtenez aucun journal, je suppose qu'ils ne font même pas un POST. Ils pourraient également appeler le mauvais point de terminaison ou envoyer le mauvais type de données ou de données dans le mauvais format. Vous avez besoin de cette information. –

Répondre

0

J'ai ajouté un gestionnaire pour Application_BeginRequest tout ce que je vous connecter à fait Application_EndRequest. Et il s'avère que la longueur du contenu était zéro et qu'il n'y avait pas de contenu. J'ai également redémarré le serveur Web IIS pour qu'il enregistre également les champs personnalisés. Ce qui est étrange, c'est que si j'envoie du contenu vide via Postman, j'obtiens le code d'action exécuté, mais pour une raison quelconque, quand il le fait, ce n'est pas le cas.