Casablanca: WebAPI-ajax Internal Server Error

Hallo,

ich muss eine WebAPI-Methode via Ajax aufrufen und den gesamsten Form-Inhalt als Objekt an die Methode weiter geben. Mein Code ist wie folgt:

<form method="post" id="form1">
   <div class="form-group">
      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
          @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
          @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
      </div>
   </div>

   ...
</form>

<script>
    $(document).ready(function () {
        $("#edit").click(function () {
            $.ajax({
                type: 'POST',
                url: 'http://localhost:10829/api/MyController/Edit',
                dataType: 'json',
                data: $('#form1').serialize(),
                success: function (data) {
                   alert("success");
                },
                error: function (xhr, textStatus, errorThrown) {
                    alert("Error: " + textStatus);
                }
            });
        });
    });
</script>

Ich bekomme nun die ganze Zeit bei dem Anklicken des Submit-Buttons eine "Internal Server Error". Leider weiß ich nicht ganz genau, woran das Problem liegen kann. Hat jemand da eine Idee?

Danke im Voraus.

  1. Hallo, hier spricht dein Webserver!

    Ich bekomme nun die ganze Zeit bei dem Anklicken des Submit-Buttons eine "Internal Server Error". Leider weiß ich nicht ganz genau, woran das Problem liegen kann. Hat jemand da eine Idee?

    Frag' mich! Bitte, bitte! Ich posaune Interna nicht gerne in alle Welt hinaus, deshalb sende ich an deinen Browser nur eine allgemeine Fehlermeldung. Damit lasse ich dich aber nicht allein, wirklich nicht! Ich führe ein Fehlerprotokoll, in dem genauere Einzelheiten zu finden sind! Da gucke doch bitte rein!

    Ach, würde doch jemand auf mich hören.

    Ganz doll liebe Grüße von deinem Server! Mit Ausrufezeichen!

    1. Hallo,

      wo finde ich denn das besagte Fehlerprotokoll.

      Gruß

      1. wo finde ich denn das besagte Fehlerprotokoll.

        Auf dem Webserver. Genauer können wir Auskunft geben, wenn Du uns hier im Forum eine treffliche (aus dem Internet, also auch Russland oder Bulgarien mögliche) Verbindungsmethode, die IP-Adresse, dazu auch Benutzername und Passwort des Systemadministrators nennst.

        Wir vermuten, Du wirst das tun. Immerhin erwartest Du von uns, dass wir Dir sagen wo das Error-Log des Servers ist - ohne uns wenigstens über Betriebssystem, Server-Software (Was lauscht denn an localhost, Port 10829?) und Versionen aufzuklären.

        1. Hallo,

          danke. Ich arbeite momentan lokal und alles läuft bei mir lokal. Also es gibt keinen Server in dem Sinne. Und wozu brauchst du die IP-Adresse, dazu auch Benutzername und Passwort des Systemadministrators, um meine Frage zu beantworten? Das kommt mir aber sehr verdächtig vor. Solche Informationen würde ich niemandem geben, auch wenn ich hier um eine Antwort gebeten habe. Sorry, versuch das bitte woanders.

          Gruß

          1. Ein Ironie-Tag gibt's nicht; vielleicht hätten Dein Server und Regina Schaukrug das Satire-Tag verwenden sollen?

            Rolf

  2. Tach!

    Ich bekomme nun die ganze Zeit bei dem Anklicken des Submit-Buttons eine "Internal Server Error". Leider weiß ich nicht ganz genau, woran das Problem liegen kann. Hat jemand da eine Idee?

    Ich würde erstmal die Konfiguration in der Web.config prüfen, ob da genügend Geschwätzigkeit eingestellt ist. Beispielsweise mit den Tipps von http://stackoverflow.com/questions/4416068/http-500-internal-error-iis-websites.

    Es kann sein, dass im error-Callback nicht die gesamte Response und in ihr mehr Informationen zur Verfügung stehen. Aber es gibt ja die Entwicklertools in den Browsern, und da den Netzwerk-Abschnitt, in dem man sich den kompletten Request mit Response anschauen kann. Und den Fiddler (von Telerik) gibts auch noch, um HTTP-Verkehr zu inspizieren.

    dedlfix.

    1. Hallo,

      danke. Das Problem taucht anscheint nur bei der POST-Übertragung. Mit Get funktioniert nun. Der String sieht aber z.B. so aus: Id=9&Name=Toyota&Model=Aris&Color=Blue&Price=1420. Diesen bekomme ich in myString zurückgeliefert.

      [HttpGet]
      public string Put(string myString)
      {
        ...
      }
      

      Mit $("#form").serializeArray() bekomme ich eine liste von Objekten ([object Object],[object Object],[object Object],[object Object],[object Object]). Ich weiß nun aber nicht, wie der Datentyp von myString in dem Fall sein soll.

      Gruß

      1. Ob es bei WebAPI hilft, in der web.config <customErrors mode="Off"/> zu setzen, müsste ich erst ausprobieren, das kann ich nicht sicher sagen.

        Du könntest auch in der global.asax.cs einen Breakpoint in Application_BeginRequest setzen. Wenn Du danach weiter laufen lässt, sollte die Exception, die zum HTTP 500 führt, sichtbar werden.

        Ein Breakpoint in der Put-Methode wird nicht helfen, weil er da nicht mehr hineinkommt.

        Ich würde bei Verwendung der Post-Methode übrigens denken, dass WebAPI da ein Objekt erwartet, das deinen Form-Feldern entspricht (also Id, Name, Model, Color, Price). Wenn Du dort einen String entgegennehmen willst, kann WebAPI die geposteten Felder darin nicht ablegen.

        Rolf

        1. Tach!

          Du könntest auch in der global.asax.cs einen Breakpoint in Application_BeginRequest setzen.

          Dort kann man auch noch eine Menge andere Event-Handler einfügen, beispielsweise bei Exceptions, mit denen sich auch ein paar Erkenntnisse gewinnen lassen.

          dedlfix.