JQuery Ajax Post führt zu 500 internen Serverfehlern

81

Ich versuche, diesen AJAX-Beitrag auszuführen, erhalte jedoch aus irgendeinem Grund einen Server 500-Fehler. Ich kann sehen, dass es Haltepunkte im Controller trifft. Das Problem scheint also im Rückruf zu liegen. Jemand?

$.ajax({
    type: "POST",
    url: "InlineNotes/Note.ashx?id=" + noteid,
    data: "{}",
    dataType: "json",

    success: function(data) {
        alert(data[1]);
    },
    error: function(data){
        alert("fail");
    }
});

Dies ist die Zeichenfolge, die zurückgegeben werden sollte:

{status:'200', text: 'Something'}
Nick
quelle
.ashx = .NET-Plattform? Was hat das mit Java zu tun?
Matt B
Ist es möglich, den Aufruf ohne $ sign oder jQuery-Präfix vor ".ajax" korrekt durchzuführen?
Sinan
Ja. Ich verwende jQuery.noConflicts (). Das Präfix ist korrekt. Wie ich sagte. Es macht die Anfrage .. aber der Fehler wird zurückgegeben.
Nick
Überprüfen Sie den Beitrag hier Developernote.com/2014/01/…
Shamcs
Der obige Link von @shamcs enthält am Ende eine Zeichenfolge, die ihn ungültig macht. Der richtige Link ist Developersnote.com/2014/01/…
Erenor Paz

Antworten:

67

Ich vermute, dass die Servermethode eine Ausnahme auslöst, nachdem sie Ihren Haltepunkt überschritten hat. Verwenden Sie Firefox / Firebug oder die IE8-Entwicklertools, um die tatsächliche Antwort anzuzeigen, die Sie vom Server erhalten. Wenn es eine Ausnahme gegeben hat, erhalten Sie das YSOD-HTML, mit dessen Hilfe Sie herausfinden können, wo Sie suchen müssen.

Eine weitere Sache - Ihre Dateneigenschaft sollte {} nicht "{}" sein, das erstere ist ein leeres Objekt, während das letztere eine Zeichenfolge ist, die als Abfrageparameter ungültig ist. Besser noch, lassen Sie es einfach weg, wenn Sie keine Daten übergeben.

Tvanfosson
quelle
2
Ihr erster Satz ist irreführend (was bedeutet, dass der 500-Fehler clientseitig auftritt). Ich habe Sie fast dafür herabgestimmt, bevor ich die Antwort gründlicher gelesen habe. Vielleicht möchten Sie etwas klarstellen.
Macha
4
fiddler2.com ist auch sehr nützlich, um die tatsächliche Antwort vom Server anzuzeigen.
Glen Little
: o etwas, das Chrome Dev Tools tatsächlich nicht bietet!
Jimmy
1
Sie können dies in Chrome debuggen. Weitere
Informationen finden
33

Falls jemand das Codeigniter-Framework verwendet, kann das Problem durch die aktivierte CSRF-Schutzkonfiguration verursacht werden.

v1r00z
quelle
7
Ich bin gerade vor einigen Minuten auf dieses Problem eingegangen ... Ihre Antwort gab mir den Hinweis :) Vielleicht interessant für andere, um dies zu vermeiden. Das Hinzufügen zu den Daten löst das Problem: <? = $ This-> security-> get_csrf_token_name ()? >: '<? = $ this-> security-> get_csrf_hash ()?>'
Suppentaucher
Vielen Dank, ich bin in Bonfire festgefahren und kenne CodeIgniter noch nicht gut genug, um das herauszufinden.
Andyface
19

Ich hatte gerade dieses Problem selbst, obwohl ich in meinem Fall den Grund dafür nicht finden konnte, als ich von POSTzu wechselte GET, verschwand der Problem 500-Fehler!

 type:'POST'
Stian
quelle
9
aber keine echte Lösung. Einige Dinge müssen POST sein
localhoost
2
Das ist völlig falsch. Wenn das Ändern von POST in GET tatsächlich funktioniert hat, haben Sie zuerst den falschen HTTPVerb verwendet. Wenn Sie POST verwenden müssen, weil Sie beispielsweise eine Nutzlast senden, müssen Sie POST verwenden, und die Verwendung von GET würde nicht funktionieren. Und auf der anderen Seite, wenn Sie nur etwas bekommen und GET verwenden können, verwenden Sie POST nicht, GET wird zwischengespeichert (abhängig manchmal von der Konfiguration)
polonskyg
18

Dies ist Ajax Request Simple Code zum Abrufen von Daten über Ajax Request

$.ajax({
    type: "POST",
    url: "InlineNotes/Note.ashx",
    data: '{"id":"' + noteid+'"}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data) {
        alert(data.d);
    },
    error: function(data){
        alert("fail");
    }
});
HdO
quelle
3
contentType: "application / json; charset = utf-8", ich habe diese Zeile entfernt und dann mein Problem gelöst
Taja_100
11

Ich hatte einen ähnlichen zusammengesetzten Fehler, der zwei Lösungen erforderte. In meinem Fall war der Technologie-Stack MVC / ASP.NET / IIS / JQuery. Die Serverseite schlug mit einem 500-Fehler fehl, und dies trat auf, bevor die Anforderung vom Controller verarbeitet wurde, was das Debuggen auf der Serverseite schwierig machte.

Mit dem folgenden clientseitigen Debug konnte ich den Serverfehler ermitteln

Zeigen Sie im Fehlerrückruf $ .ajax die Fehlerdetails der Konsole an

  error: (error) => {
                     console.log(JSON.stringify(error));
   }

Dies ermöglichte es mir zumindest, den anfänglichen Serverfehler anzuzeigen

"Die JSON-Anforderung war zu groß, um serialisiert zu werden."

Dies wurde im Client web.config behoben

<appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />

Die Anforderung ist jedoch weiterhin fehlgeschlagen. Aber diesmal mit einem anderen Fehler, den ich jetzt auf der Serverseite debuggen konnte

"Anfrage zu groß"

Dies wurde behoben, indem dem Dienst web.config Folgendes hinzugefügt wurde

<configuration>
…
 <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="524288">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"  />
        </binding>
      </basicHttpBinding>
    </bindings>

Die Konfigurationswerte müssen möglicherweise weiter optimiert werden, aber zumindest wurden die durch den Ajax-Beitrag verursachten Serverfehler behoben.

Robotronic
quelle
10

Sie können hier (oder hier ) nach HTTP-Statuscodes suchen. Dieser Fehler sagt Ihnen Folgendes:

"Der Server hat einen unerwarteten Zustand festgestellt, der die Erfüllung der Anforderung verhindert hat."

Sie müssen Ihren Server debuggen.

Tom
quelle
Vielen Dank, ich hatte dieses Problem. In der Aktionsdatei konnte ich keine Verbindung zur Datenbank herstellen, um Daten zu speichern, sodass jQuery post (). Doed () einen Fehler von 500 erhielt.
Harkály Gergő
8

Ich stoße heute auf dasselbe. Aktivieren Sie, wie zuvor vorgeschlagen, Firebug für Firefox, aktivieren Sie die Konsole und zeigen Sie eine Vorschau der POST-Antwort an. Das half mir herauszufinden, wie dumm das Problem war. Meine Aktion erwartete den Wert eines Typs int und ich postete eine Zeichenfolge. (ASP.NET MVC2)

Artur Kędzior
quelle
6

In EventVwr sollte ein Ereignis protokolliert sein (Warnung von asp.net), das Ihnen weitere Informationen darüber geben kann, wo der Fehler liegen könnte.

Ramesh
quelle
4

Ein 500 von ASP.NET bedeutet wahrscheinlich, dass irgendwann eine nicht behandelte Ausnahme ausgelöst wurde, als die Anforderung bearbeitet wurde.

Ich schlage vor, dass Sie dem Webserverprozess einen Debugger hinzufügen (vorausgesetzt, Sie haben Zugriff).

Eine seltsame Sache: Sie stellen eine POST-Anfrage an den Server, übergeben jedoch keine Daten (alles befindet sich in der Abfragezeichenfolge). Vielleicht sollte es stattdessen eine GET-Anfrage sein?

Sie sollten auch überprüfen, ob die URL korrekt ist.

Codeape
quelle
Richtig. Ich habe ursprünglich ein GET verwendet, aber ich erhalte den gleichen Fehler.
Nick
1
Haben Sie versucht, die Anfrage über die Adressleiste des Browsers zu bearbeiten? Erhalten Sie dann auch einen 500-Status?
Codeape
3

Ich stehe heute nur vor diesem Problem. Mit dieser Art von Fehler erhalten Sie keine Antworten vom Server. Daher ist es sehr schwierig, das Problem zu finden.

Aber ich kann Ihnen sagen, dass "500 interner Serverfehler" ein Fehler ist, wenn der Server nicht der Client ist. Sie haben einen Fehler im serverseitigen Skript erhalten. Kommentieren Sie das Schließen des Codes durch Schließen aus und versuchen Sie es erneut. Sie werden bald feststellen, dass Sie irgendwo einen Charakter vermissen.

wütende Kiwi
quelle
3

Sie können diesen Fehler auch in VB erhalten, wenn die von Ihnen aufgerufene Funktion mit Public Shared Function und nicht mit Public Function im Webservice beginnt . (Wie es passieren kann, wenn Sie die Funktion aus einer Klasse verschieben oder kopieren). Nur eine andere Sache, auf die man achten muss.

Cody Hackjob
quelle
2

Können Sie die Signatur Ihrer Methode veröffentlichen, die diesen Beitrag akzeptieren soll?

Außerdem erhalte ich dieselbe Fehlermeldung, möglicherweise aus einem anderen Grund. Mein YSOD hat darüber gesprochen, dass das Wörterbuch keinen Wert für den nicht nullbaren Wert enthält. Die Art und Weise, wie ich die YSOD-Informationen erhielt, bestand darin, einen Haltepunkt in die $ .ajax-Funktion zu setzen, der eine Fehlerrückgabe wie folgt behandelte:

<script type="text/javascript" language="javascript">
function SubmitAjax(url, message, successFunc, errorFunc) {
    $.ajax({
        type:'POST',
        url:url,
        data:message,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success:successFunc,
        error:errorFunc
        });

};

Dann ist mein errorFunc-Javascript so:

function(request, textStatus, errorThrown) {
        $("#install").text("Error doing auto-installer search, proceed with ticket submission\n"
        +request.statusText); }

Mit IE ging ich zum Menü -> Skript-Debugger -> Pause bei der nächsten Anweisung. Dann ging ich, um den Code auszulösen, der meinen Beitrag starten würde. Dies führte mich normalerweise irgendwo tief in die Bibliothek von jQuery, anstatt dorthin, wo ich wollte, da die ausgewählte Dropdown-Öffnung jQuery auslöste. Also drückte ich StepOver, dann brach auch die nächste Zeile, wo ich sein wollte. Dann wechselt VS für diese Seite in den clientseitigen (dynamischen) Modus, und ich habe eine Unterbrechung in die $("#install")Zeile eingefügt, damit ich (mit der Maus über das Debuggen) sehen kann, was angefordert wurde, textStatus, errorThrown. Anfrage. In request.ResponseText gab es eine HTML-Nachricht, in der ich sah:

<title>The parameters dictionary contains a null entry for parameter 'appId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ContentResult CheckForInstaller(Int32)' in 'HLIT_TicketingMVC.Controllers.TicketController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.<br>Parameter name: parameters</title>

Überprüfen Sie dies alles und veröffentlichen Sie die Signatur Ihrer Controller-Methode, falls dies Teil des Problems ist

Maslow
quelle
2

Ich hatte diesen Fehler zu. Ich hatte die .htaccess-Umleitung in einem Verzeichnis konfiguriert. Nun, es leitet Ajax-Aufrufe an ofcourse ( $.post(../ajax.php)) um, sodass die eigentliche Datei nicht gefunden werden konnte (was zu 500 Fehlern führte).

Ich habe es 'behoben', indem ich die Datei ajax.php in ein Verzeichnis gestellt habe (also .htaccessnicht betroffen).

Tessmore
quelle
2

Ich konnte die Lösung mithilfe des Chrome- Debuggers finden (ich habe Firebug oder andere Tools von Drittanbietern nicht installiert).

  • Gehen Sie zur Registerkarte Entwickler (STRG + MAJ + I).
  • Netzwerk > Klicken Sie auf die fehlgeschlagene Anforderung in Rot> Vorschau

Es zeigte mir, dass ich ein Problem auf dem Server hatte, als ich einen Wert zurückgab, der sich selbst referenzierte.

Mikaël Mayer
quelle
2

In meinem Fall war es ein einfaches Problem, aber schwer zu finden. Die Seitenanweisung hatte falsche Inherits-Attribute. Es muss nur die oberste Ebene enthalten und es hat funktioniert.

Falscher Code

<%@ Page Language="C#" CodeBehind="BusLogic.aspx.cs" Inherits="BusLogic"%>

Richtiger Code

<%@ Page Language="C#" CodeBehind="BusLogic.aspx.cs" Inherits="Web.BusLogic" %>
Jas
quelle
1

Laden Sie bei Verwendung des CodeIgniter-Frameworks mit aktiviertem CSRF-Schutz das folgende Skript auf jeder Seite, auf der ein Ajax-POST auftreten kann:

$(function(){
    $.ajaxSetup({
        data: {
            <?php echo $this->config->item('csrf_token_name'); ?>: $.cookie('<?php echo $this->config->item('csrf_cookie_name'); ?>')
        }
    });
});

Benötigt: jQuery und jQuery.cookie Plugin

Quellen: https://stackoverflow.com/a/7154317/2539869 und http://jerel.co/blog/2012/03/a-simple-solution-to-codeigniter-csrf-protection-and-ajax

Kevin
quelle
1

Die JSON-Daten, die Sie an den Server übergeben, sollten denselben Namen haben, den Sie auf der Clientseite erstellt haben. Ex:

var obj = {  Id: $('#CompanyId').val(),
             Name: $("#CompanyName").val()
            };

$.Ajax(data: obj,
url: "home/InsertCompany".....

Wenn der Name anders ist, z.

[HttpPost]
public ActionResult InsertCompany(Int32 Id, string WrongName)
{
}

Sie erhalten diesen Fehler.

Wenn Sie die Daten nicht übergeben, entfernen Sie das Datenattribut aus der AJAX-Anforderung.

Nalan Madheswaran
quelle
1

Ich hatte dieses Problem und fand heraus, dass die serverseitige C # -Methode statisch sein sollte .

Kundenseite:

$.ajax({
            type: "POST",
            url: "Default.aspx/ListItem_Selected",
            data: "{}",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: ListItemElectionSuccess,
            error: ListItemElectionError
        });

        function ListItemElectionSuccess(data) {
            alert([data.d]);
        }
        function ListItemElectionError(data) {

        }

Serverseite:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static String ListItem_Selected()
    {
        return "server responce";
    }
}
Apex ND
quelle
Kann ich ein Beispiel zum Abrufen des JSON-Objekts und der Eigenschaften auf der Serverseite erhalten? Wenn Daten: {Prop1: "asdf", Prop2: "zxcv"}, wie erhalte ich dann Prop1- und Prop2-Werte in der öffentlichen statischen String ListItem_Selected () -Funktion? Vielen Dank.
Mehdi Anis
1

Wie bereits erwähnt, sind Ihre Daten für die Rückgabezeichenfolge sehr lang. Daher wurde das JSON-Format beschädigt.

Es gibt einen anderen Weg für dieses Problem. Sie sollten die maximale Größe für JSON-Daten folgendermaßen ändern:

Öffnen Sie die Datei Web.Config und fügen Sie diese Zeilen in den Konfigurationsabschnitt ein

<system.web.extensions>
  <scripting>
    <webServices>
      <jsonSerialization maxJsonLength="50000000"/>
    </webServices>
  </scripting>
</system.web.extensions>
Emad Armoun
quelle
1

Ich hatte auch das gleiche Problem. Hier sind zwei Möglichkeiten, wie ich es gelöst habe: 1. Wenn Sie ein Framework verwenden, stellen Sie sicher, dass Sie auch ein CSRF-Token mit dem Ajax-Aufruf senden. So sieht die Syntax für Laravel aus:

<meta name="_token" content="{{ csrf_token() }}">

Stellen Sie in Ihrer js-Datei sicher, dass Sie dies aufrufen, bevor Sie den Ajax-Aufruf senden

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. Ein anderer Weg , um es zu lösen wäre zu ändern methodvon postbisget
Koushik Das
quelle
1

Für mich war der Fehler in der PHP-Datei, an die ich eine Anfrage gesendet habe. Fehler war in der Datenbankverbindung. Nach dem Korrigieren des PHP-Codes wurde der Fehler behoben.

J4GD33P 51NGH
quelle
1

Ihr Code enthält dataType: json .

In diesem Fall wertet jQuery die Antwort als JSON aus und gibt ein JavaScript-Objekt zurück. Die JSON- Daten werden streng analysiert. Jeder fehlerhafte JSON wird zurückgewiesen und ein Analysefehler wird ausgelöst. Eine leere Antwort wird ebenfalls abgelehnt.

Der Server sollte stattdessen eine Antwort von nulloder zurückgeben {}.

Subhash Diwakar
quelle
1

Ich fand dies in Chrome, als ich zwei Ajax-Abfragen im jquery- On-Load -Handler durchführte.

dh wie $(function() { $.ajax() ... $.ajax() ... });

Ich habe es vermieden mit:

setTimeout(function_to_do_2nd_ajax_request, 1);

Es ist vermutlich ein Chrom- und / oder JQuery-Fehler

Sam Watkins
quelle
1

Ich hatte dieses Problem, weil die Seite, von der ich Ajax-Post aufgerufen habe, hatte EnableViewState="false"und EnableViewStateMac="false"nicht die Seite, die aufgerufen wurde.

Als ich dies auf beide Seiten stellte, fing alles an zu funktionieren. Ich vermutete dies, als ich eine MAC-Adressausnahme sah.

Sandip
quelle
0

Ihre Rückgabezeichenfolgendaten können sehr lang sein.

<system.web>        
   <compilation debug="true" targetFramework="4.0" />
   <httpRuntime maxRequestLength="2147483647" />
</system.web>

Zum Beispiel:

  • 1 Char = 1 Byte
  • 5 Char = 5 Byte
  • "Hakki" = 5 Byte
Hakkı Eser
quelle
0

Verwenden Sie einen Try Catch-Block auf Ihrer Serverseite und geben Sie im Catch-Block den Ausnahmefehler an den Client zurück. Dies sollte Ihnen eine hilfreiche Fehlermeldung geben.

Jack Fairfield
quelle
0

Ich hatte ähnliche Probleme mit AJAX-Code, der sporadisch den "500 Internal Server Error" zurückgibt. Ich habe das Problem durch Erhöhen der Werte "fastCGI" RequestTimeout und ActivityTimeout behoben.

Steven Chinman
quelle
Welchen Webserver betrifft das? Könnten Sie bitte einen Code hinzufügen?
Max Leske
0

Ich bin spät dran, aber ich hatte dieses Problem und habe gelernt, dass es ein Fehler in meinem PHP-Code war (in meinem Fall die Syntax einer Auswahl für die Datenbank). Normalerweise ist dieser Fehler 500 nach meiner Erfahrung mit Syntax zu tun. Mit anderen Worten: "Peopleware" -Problem! : D.

ArtFranco
quelle
0

Wenn die von Ihnen ausgeführte Abfrage zusätzlich zur Antwort "Fehlgebildeter JSON" ein Objekt oder etwas zurückgibt, das die Serialisierung der Daten verhindert, wird dieser Fehler angezeigt. Sie sollten immer sicher sein, dass Sie JSON und nur JSON am Ende Ihrer Aktionsmethode haben oder von was auch immer Sie die Daten erhalten.

GidiBloke
quelle
0

Normalerweise ist Ihre Eigenschaft nicht ganz richtig oder etwas falsch mit Ihrer Serververarbeitung.

Bcktr
quelle