web-dev-qa-db-fra.com

Comment puis-je déboguer une erreur de 500 serveur interne lors de l'appel d'une API Web à partir d'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 POST 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 dans le 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 du fichier.

Des idées?

Voici le code client:

    <script type="text/javascript">
        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); }
            });
        };

    </script>

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=?=
16
Bruce C

Pour voir toutes les exceptions, activez le paramètre suivant:

  • 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. 

33
Alexei Levenkov

Vous pouvez essayer de vous inscrire à l'événement Error de l'objet 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().ToString()
    );
}
0
Protector one