Comment puis-je déboguer une erreur 500 Internal Server lors de l’appel d’une WebApi depuis ajax?

Je reçois une erreur de 500 serveur interne dans un projet MVC 4.5 WebApi. Je peux appeler avec succès mon service Web avec un GET et un GET avec un ID. Mais, quand je poste un fichier, je reçois l’erreur. Je peux définir un point d’arrêt dans Application_BeginRequest() et confirmer que je reçois d’abord une demande OPTIONS, puis le POST. La méthode du contrôleur n’est pas appelée et j’ai ajouté une méthode Application_Error() à Global.asax.cs qui n’est pas touchée non plus. La page html est en cours d’exécution, mais j’ai déjà traité cela avec ThinkTecture.IdentityModel . Je suis le code ici pour le téléchargement de fichier.

Des idées?

Voici le code client:

   var UploadDocument = function () { var url = sessionStorage.getItem("url"); var auth = sessionStorage.getItem("auth"); var data = new FormData(); jQuery.each($('#fileToUpload')[0].files, function (i, file) { data.append('file-' + i, file); }); jQuery.support.cors = true; $.ajax({ type: "POST", url: url, data: data, cache: false, processData: false, contentType: false, //dataType: "json", headers: { Authorization: 'Basic ' + auth }, crossDomain: true, success: function (data, textStatus, jqXHR) { alert('Success'); }, error: function (jqXHR, textStatus, errorThrown) { alert('Error: ' + textStatus + ' ' + errorThrown.message); } }); };  

Mon code de contrôleur ressemble à ceci:

  public int Post(HttpPostedFileBase FileToUpload) { // Do stuff with the file } 

La demande et la réponse ressemblent à ceci:

 Request URL:http://localhost:51234/api/TaxDocument Request Method:POST Status Code:500 Internal Server Error Request Headers Accept:*/* Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Authorization:Basic YmNhbGxlbjpuZWxsYWM= Connection:keep-alive Content-Length:2054044 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryIGzPKhvRVwFXbupu Host:localhost:51234 Origin:http://localhost:52386 Referer:http://localhost:52386/Upload.html User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 Response Headers: Access-Control-Allow-Credentials:true Access-Control-Allow-Origin:http://localhost:52386 Cache-Control:no-cache Content-Length:1133 Content-Type:application/json; charset=utf-8 Date:Tue, 06 Nov 2012 21:10:23 GMT Expires:-1 Pragma:no-cache Server:Microsoft-IIS/8.0 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET X-SourceFiles:=?UTF-8?B?QzpccHJvamVjdHNcU2F2ZU15VzJcU2F2ZU15VzIuV2Vic2VydmljZVxhcGlcVGF4RG9jdW1lbnQ=?= 

Pour voir toutes les exceptions, activez les parameters suivants:

  • VS 2013 (et inférieur): Débogage -> Exceptions -> CLR – cochez la case “une fois lancés”.
  • VS 2015: Debug -> Windows -> Paramètres d’exception -> CLR

Vous devrez peut-être décocher l’option “Outils-> Options-> Débogage-> Mon code uniquement” si une exception est réellement levée en dehors de votre code.

Vous pouvez essayer de vous inscrire à l’événement Error de l’object HttpApplication qui gère la demande:

 HttpApplicationReference.Error += ErrorHandler; 

La méthode qui gère l’erreur:

 public void ErrorHandler(object sender, EventArgs e) { System.Diagnostics.Debug.Write( ((System.Web.HttpApplication)sender).Server.GetLastError().ToSsortingng() ); }