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'}
Nacięcie
źródło
.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
Sprawdź post tutaj developersnote.com/2014/01/…
shamcs
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.

tvanfosson
źródło
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.

v1r00z
źródło
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'
Stian
źródło
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");
    }
});
BTE
źródło
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.

Robotronic
źródło
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.

Tomek
źródło
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)

Artur Kędzior
źródło
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.

Ramesh
źródło
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.

codeape
źródło
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ą.

zły kiwi
źródło
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ć.

Cody Hackjob
źródło
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

Maslowa
źródło
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).

Tessmore
źródło
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.

Mikaël Mayer
źródło
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" %>
Jas
źródło
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

Kevin
źródło
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.

Nalan Madheswaran
źródło
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";
    }
}
Apex ND
źródło
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>
Emad Armoun
źródło
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
Koushik Das
źródło
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.

J4GD33P 51NGH
źródło
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.

Subhash Diwakar
źródło
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

Sam Watkins
źródło
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.

sandip
źródło
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
Hakkı Eser
źródło
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.

Jack Fairfield
źródło
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”.

Steven Chinman
źródło
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

ArtFranco
źródło
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.

GidiBloke
źródło
0

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

Bcktr
źródło