JQuery Ajax Post skutkuje 500 wewnętrznym błędem serwera


81

Próbuję wykonać ten post AJAX, ale z jakiegoś powodu otrzymuję błąd 500 serwera. Widzę, że uderzył w punkty przerwania w kontrolerze. Wydaje się, że problem dotyczy oddzwaniania. Ktoś?

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

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

Oto ciąg, który powinien zostać zwrócony:

{status:'200', text: 'Something'}

.ashx = platforma .NET? Co to ma wspólnego z Javą?
— mat b

czy można poprawnie wykonać wywołanie bez znaku $ lub przedrostka jQuery przed ".ajax"?
— Sinan

Tak .. Używam jQuery.noConflicts (). Prefiks jest poprawny. Tak jak powiedziałem. Wysyła żądanie ... ale błąd jest zwracany.
— Nick


Powyższy link z @shamcs zawiera na końcu ciąg, który czyni go nieprawidłowym. Prawidłowy link to developersnote.com/2014/01/…
— Erenor Paz

Odpowiedzi:


68

Podejrzewam, że metoda serwera zgłasza wyjątek po przejściu przez punkt przerwania. Użyj przeglądarki Firefox / Firebug lub narzędzi programistycznych IE8, aby sprawdzić rzeczywistą odpowiedź, jaką otrzymujesz z serwera. Jeśli wystąpił wyjątek, otrzymasz YSOD html, który powinien pomóc Ci dowiedzieć się, gdzie szukać.

Jeszcze jedno - właściwość danych powinna mieć wartość {} nie "{}", pierwsza jest pustym obiektem, a druga jest ciągiem, który jest nieprawidłowy jako parametr zapytania. Jeszcze lepiej, po prostu pomiń to, jeśli nie przekazujesz żadnych danych.


2
Twoje pierwsze zdanie jest mylące (sugeruje, że błąd 500 występuje po stronie klienta). Prawie przegłosowałem cię za to, zanim dokładniej przeczytałem odpowiedź. Możesz trochę wyjaśnić.
— Macha

4
Witryna fiddler2.com jest również bardzo przydatna do przeglądania rzeczywistej odpowiedzi z serwera.
— Glen Little

: o coś, co w Chrome Dev Tools nie działa!
— Jimmy

1
faktycznie możesz to debugować w Chrome, sprawdź tę odpowiedź, aby uzyskać szczegółowe informacje stackoverflow.com/a/21786593/14533
— Pixelomo

33

w przypadku, gdy ktoś używa frameworka codeigniter, problem może być spowodowany włączoną konfiguracją ochrony csrf.


7
Właśnie zająłem się tym problemem kilka minut temu ... Twoja odpowiedź dała mi wskazówkę :) Może interesujące dla innych, aby tego uniknąć Dodanie tego do danych rozwiązuje problem: <? = $ This-> security-> get_csrf_token_name ()? >: '<? = $ this-> security-> get_csrf_hash ()?>'
— soupdiver

Dziękuję, utknąłem w tym w Bonfire i nie znasz jeszcze CodeIgnitera wystarczająco dobrze, aby to rozgryźć.
— andyface

19

Właśnie miał ten problem samodzielnie, chociaż nie mogłem znaleźć przyczynę tego w moim przypadku, gdy zmienia się od POSTcelu GET, błąd 500 Problem zniknął!

 type:'POST'

10
ale nie jest to prawdziwe rozwiązanie. Niektóre rzeczy muszą być POST
— atilkan

2
To jest całkowicie błędne. Jeśli zmiana POST na GET faktycznie zadziałała, to najpierw używałeś nieprawidłowego HTTPVerb. Jeśli musisz użyć POST, ponieważ na przykład wysyłasz ładunek, musisz użyć POST, a użycie GET nie zadziała. Z drugiej strony, jeśli tylko coś dostajesz i możesz użyć GET, nie używaj POST, GET jest buforowany (w zależności od konfiguracji)
— polonskyg

18

To jest prosty kod żądania Ajax do pobierania danych za pośrednictwem żądania Ajax

$.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");
    }
});

3
contentType: "application / json; charset = utf-8", usunąłem tę linię, a następnie mój problem został rozwiązany
— Taja_100

11

Wystąpił podobny błąd złożony, który wymagał dwóch rozwiązań. W moim przypadku stosem technologii był MVC / ASP.NET / IIS / JQuery. Po stronie serwera wystąpił błąd 500, co miało miejsce, zanim żądanie zostało obsłużone przez kontroler, co utrudniło debugowanie po stronie serwera.

Następujące debugowanie po stronie klienta umożliwiło mi określenie błędu serwera

W wywołaniu zwrotnym błędu $ .ajax wyświetl szczegóły błędu na konsoli

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

To przynajmniej pozwoliło mi zobaczyć początkowy błąd serwera

„Żądanie JSON było zbyt duże, aby można było go serializować”

Zostało to rozwiązane w pliku web.config klienta

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

Jednak żądanie nadal nie powiodło się. Ale tym razem z innym błędem, który mogłem teraz debugować po stronie serwera

"Wymagana jednostka jest za duża"

Zostało to rozwiązane przez dodanie następujących elementów do usługi web.config

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

Wartości konfiguracyjne mogą wymagać dalszego dostrojenia, ale przynajmniej rozwiązało to błędy serwera spowodowane przez post ajax.


10

Możesz sprawdzić kody stanu HTTP tutaj (lub tutaj ), ten błąd mówi ci:

„Serwer napotkał nieoczekiwany stan, który uniemożliwił mu realizację żądania”.

Musisz debugować swój serwer.


Dzięki, miałem ten problem, w pliku akcji nie mogłem połączyć się z bazą danych w celu przechowywania danych, więc jQuery post (). Done () otrzymał błąd 500.
— Harkály Gergő

8

Dziś napotykam to samo. Jak sugerowano wcześniej, pobierz Firebug dla Firefoksa, włącz konsolę i wyświetl podgląd odpowiedzi POST. To pomogło mi dowiedzieć się, jak głupi był problem. Moja akcja oczekiwała wartości typu int i wysyłałem string. (ASP.NET MVC2)


6

Powinno zostać zarejestrowane zdarzenie w EventVwr (ostrzeżenie z asp.net), które może dostarczyć więcej szczegółowych informacji na temat miejsca wystąpienia błędu.


4

500 z ASP.NET prawdopodobnie oznacza, że ​​w pewnym momencie podczas obsługi żądania został zgłoszony nieobsługiwany wyjątek.

Proponuję dołączyć debugger do procesu serwera WWW (zakładając, że masz dostęp).

Jedna dziwna rzecz: wysyłasz żądanie POST do serwera, ale nie przekazujesz żadnych danych (wszystko jest w ciągu zapytania). Może zamiast tego powinno to być żądanie GET?

Powinieneś również dokładnie sprawdzić, czy adres URL jest poprawny.


Racja ... Pierwotnie używałem GET, ale pojawia się ten sam błąd.
— Nick

1
Czy próbowałeś wykonać żądanie z paska adresu przeglądarki? Czy wtedy też otrzymujesz status 500?
— codeape

3

Właśnie dzisiaj mam do czynienia z tym problemem. przy tego rodzaju błędach nie otrzymasz odpowiedzi z serwera, dlatego bardzo trudno jest zlokalizować problem.

Ale mogę ci powiedzieć, że "500 wewnętrzny błąd serwera" to błąd z serwerem, a nie klientem, masz błąd w skrypcie po stronie serwera. Zakomentuj zamknięcie kodu przez zamknięcie i spróbuj uruchomić go ponownie, wkrótce przekonasz się, że gdzieś tęsknisz za jakąś postacią.


3

Możesz również otrzymać ten błąd w VB, jeśli wywoływana funkcja zaczyna się od Public Shared Function zamiast Public Function w usłudze sieciowej. (Jak może się zdarzyć, jeśli przeniesiesz lub skopiujesz funkcję z klasy). Kolejna rzecz, na którą trzeba uważać.


2

Czy możesz wysłać podpis swojej metody, która ma akceptować ten post?

Dodatkowo otrzymuję ten sam komunikat o błędzie, prawdopodobnie z innego powodu. Mój YSOD mówił o słowniku nie zawierającym wartości dla wartości nie dopuszczającej wartości null. Sposób, w jaki otrzymałem informacje YSOD, polegał na umieszczeniu punktu przerwania w funkcji $ .ajax, która obsługiwała zwrot błędu w następujący sposób:

<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
        });

};

Wtedy mój errorFunc javascript wygląda tak:

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

Używając IE poszedłem do menu widoku -> debugger skryptów -> przerwa przy następnej instrukcji. Następnie poszedłem uruchomić kod, który uruchomiłby mój post. Zwykle przenosiło mnie to gdzieś głęboko w bibliotekę jQuery zamiast tam, gdzie chciałem, ponieważ otwieranie listy rozwijanej wyboru wyzwoliło jQuery. Więc uderzyłem w StepOver, wtedy następna linia również się zepsuła, i właśnie tam chciałem być. Następnie VS przechodzi w tryb po stronie klienta (dynamiczny) dla tej strony i $("#install")wstawiłem przerwę w wierszu, aby zobaczyć (używając myszy nad debugowaniem), co było w żądaniu, status tekstu, błądThrown. żądanie. W request.ResponseText pojawił się komunikat html, w którym zobaczyłem:

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

więc sprawdź to wszystko i opublikuj swój podpis metody kontrolera na wypadek, gdyby to część problemu


2

Znalazłem się mając ten błąd do. Miałem przekierowanie .htaccess skonfigurowane w katalogu. Cóż, przekierowuje wywołania ajax do ofcourse ( $.post(../ajax.php)), więc nie może znaleźć właściwego pliku (co powoduje błąd 500).

Naprawiłem to poprzez umieszczenie pliku ajax.php w katalogu (więc .htaccessnie miało to wpływu).


2

Udało mi się znaleźć rozwiązanie za pomocą debugera Chrome (nie mam zainstalowanego Firebuga ani innych narzędzi innych firm)

  • Przejdź do zakładki programisty (CTRL + MAJ + I)
  • Sieć > kliknij żądanie, które się nie powiodło, na czerwono> Podgląd

Pokazał mi, że mam problem na serwerze, kiedy zwracałem wartość, która odwoływała się do siebie.


2

W moim przypadku była to prosta sprawa, ale trudna do znalezienia. Dyrektywa Page zawierała nieprawidłowe atrybuty Inherits. Wystarczy uwzględnić najwyższy poziom i zadziałało.

Niepoprawny kod

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

Prawidłowy kod

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

1

Korzystając z frameworku CodeIgniter z włączoną ochroną CSRF, załaduj następujący skrypt na każdej stronie, na której może się zdarzyć ajax POST:

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

Wymaga: wtyczki jQuery i jQuery.cookie

Źródła: https://stackoverflow.com/a/7154317/2539869 i http://jerel.co/blog/2012/03/a-simple-solution-to-codeigniter-csrf-protection-and-ajax


1

Dane JSON, które przesyłasz do serwera, powinny mieć taką samą nazwę, jaką tworzysz po stronie klienta. Dawny:

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

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

Jeśli nazwa jest inna, np:

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

Otrzymasz ten błąd.

Jeśli nie przekazujesz danych, usuń atrybut danych z żądania AJAX.


1

Miałem ten problem i odkryłem, że metoda C # po stronie serwera powinna być statyczna .

Strona klienta:

$.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) {

        }

Po stronie serwera:

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";
    }
}

Czy mogę uzyskać przykład, jak uzyskać obiekt JSON i właściwości po stronie serwera? Jeśli data: {Prop1: "asdf", Prop2: "zxcv"}, to w jaki sposób uzyskać wartości Prop1 i Prop2 wewnątrz publicznej statycznej funkcji String ListItem_Selected ()? Dzięki.
— Mehdi Anis

1

Jak wspomniano, myślę, że dane zwrotne są bardzo długie. więc format JSON został uszkodzony.

Jest inny sposób rozwiązania tego problemu. Powinieneś zmienić maksymalny rozmiar danych JSON w ten sposób:

Otwórz plik Web.Config i wklej te wiersze do sekcji konfiguracji

<system.web.extensions>
  <scripting>
    <webServices>
      <jsonSerialization maxJsonLength="50000000"/>
    </webServices>
  </scripting>
</system.web.extensions>

1

Ja też stanąłem przed tym samym problemem. Oto dwa sposoby rozwiązania tego problemu - 1. Jeśli używasz jakiegoś frameworka, upewnij się, że wysyłasz token CSRF również z wywołaniem ajax. Oto jak będzie wyglądać składnia laravel -

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

W swoim pliku js upewnij się, że wywołałeś to przed wysłaniem wywołania Ajax

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. Innym sposobem rozwiązania tego problemu jest zmiana methodz postnaget

1

U mnie błąd był w pliku php, do którego wysyłałem żądanie. Wystąpił błąd w łączności z bazą danych. Po naprawieniu kodu php błąd został rozwiązany.


1

Twój kod zawiera dataType: json .

W tym przypadku jQuery ocenia odpowiedź jako JSON i zwraca obiekt JavaScript. Dane JSON są analizowane w ścisły sposób. Każdy źle sformułowany kod JSON jest odrzucany i zgłaszany jest błąd analizy. Pusta odpowiedź jest również odrzucana.

Serwer powinien zwrócić odpowiedź nulllub {}zamiast tego.


1

Zauważyłem, że to miało miejsce w chrome, kiedy wykonałem dwa zapytania ajax w module obsługi jquery `` on load '',

tj. jak $(function() { $.ajax() ... $.ajax() ... });

Uniknąłem tego używając:

setTimeout(function_to_do_2nd_ajax_request, 1);

przypuszczalnie jest to błąd chrome i / lub jquery


1

Miałem ten problem, ponieważ strona nazwałem ajax post from miał EnableViewState="false"a EnableViewStateMac="false"jednak nie strona nazywa.

Kiedy umieściłem to na obu stronach, wszystko zaczęło działać. Podejrzewałem to, gdy zobaczyłem wyjątek adresu MAC.


0

Twoje dane zwrotne mogą być bardzo długie.

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

Na przykład:

  • 1 znak = 1 bajt
  • 5 znaków = 5 bajtów
  • „Hakki” = 5 bajtów

0

Użyj bloku Try Catch po stronie serwera, aw bloku catch przekaż błąd wyjątku do klienta. Powinno to dać pomocny komunikat o błędzie.


0

Miałem podobne problemy z kodem AJAX, który sporadycznie zwraca „wewnętrzny błąd serwera 500”. Rozwiązałem problem, zwiększając wartości RequestTimeout i ActivityTimeout „fastCGI”.


Którego serwera internetowego to dotyczy? Czy mógłbyś dodać jakiś kod?
— Max Leske

0

Jestem spóźniony, ale miałem ten problem i dowiedziałem się, że był to błąd w moim kodzie PHP (w moim przypadku składnia wyboru do bazy danych). Zwykle ten błąd 500 jest czymś do zrobienia przy użyciu składni - z mojego doświadczenia. Innymi słowy: problem z "oprogramowaniem dla ludzi"! :RE


0

Jako dodatek do odpowiedzi „źle sformułowany JSON”, jeśli uruchamiane zapytanie zwróci obiekt lub cokolwiek, co uniemożliwia serializację danych, pojawi się ten błąd. Powinieneś zawsze mieć pewność, że masz JSON i tylko JSON na końcu metody akcji lub cokolwiek, z czego otrzymujesz dane.


0

Zwykle Twoja własność nie jest całkowicie w porządku lub coś jest nie tak z przetwarzaniem na serwerze.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.