JQuery Ajax Post призводить до 500 внутрішніх помилок сервера


81

Я намагаюся виконати цю публікацію AJAX, але з якихось причин я отримую помилку сервера 500. Я бачу, що він потрапляє в точки зупинки в контролері. Тож проблема, схоже, у зворотному дзвінку. Хто-небудь?

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

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

Це рядок, який слід повернути:

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

.ashx = .NET платформа? Яке відношення це має до Java?
matt b

чи можна правильно зателефонувати без префікса $ або jQuery перед ".ajax"?
Сінан

Так .. Я використовую jQuery.noConflicts (). Префікс правильний. Як я вже сказав. Він робить запит .. але помилка повертається.
Нік

Перевірте допис тут developersnote.com/2014/01/…
shamcs

Посилання вище з @shamcs містить рядок у кінці, що робить його недійсним. Правильне посилання - developersnote.com/2014/01/…
Erenor Paz,

Відповіді:


68

Я підозрюю, що метод сервера видає виняток після того, як передає вашу точку зупинки. Використовуйте Firefox / Firebug або інструменти розробника IE8, щоб переглянути фактичну відповідь, яку ви отримуєте від сервера. Якщо було виняток, ви отримаєте YSOD html, який повинен допомогти вам зрозуміти, де шукати.

Ще одне - властивість ваших даних має бути {} не "{}", перший - це порожній об'єкт, а другий - рядок, який є недійсним як параметр запиту. А ще краще, просто залиште це, якщо ви не передаєте жодних даних.


2
Ваше перше речення вводить в оману (маючи на увазі помилку 500, що трапляється на стороні клієнта). Я ледь не підтримав вас за це, перш ніж прочитати відповідь більш ретельно. Можливо, ви захочете трохи пояснити.
Macha,

4
fiddler2.com також дуже корисний для перегляду фактичної відповіді сервера.
Glen Little

: o щось Chrome Dev Tools насправді не вистачає!
Джиммі

1
на самому ділі ви можете налагоджувати це в Chrome, перевірити цей відповідь на деталі stackoverflow.com/a/21786593/14533
Pixelomo

33

у випадку, якщо хтось використовує фреймворк codeigniter, проблема може бути спричинена ввімкненою конфігурацією захисту csrf.


7
Я щойно пішов у цю проблему кілька хвилин тому ... ваша відповідь дала мені підказку :) Можливо, цікаво іншим уникнути цього. Додавання цього до даних вирішує проблему: <? = $ This-> security-> get_csrf_token_name ()? >: '<? = $ this-> security-> get_csrf_hash ()?>'
soudiver

Дякую, застряг на цьому в Bonfire і поки не знаю достатньо добре CodeIgniter, щоб це зрозуміти.
andyface

19

Я просто мав цю проблему сам, хоча в моєму випадку я не міг знайти причину, при переході з POSTна GET, помилка проблеми 500 зникла!

 type:'POST'

10
але не реальне рішення. Деякі речі повинні бути POST
atilkan

2
Це абсолютно неправильно. Якщо зміна POST на GET насправді спрацювала, то спочатку ви використовували неправильний HTTPVerb. Якщо вам потрібно використовувати POST, оскільки, наприклад, ви надсилаєте корисне навантаження, ви повинні використовувати POST, і використання GET не буде працювати. А з іншого боку, якщо ви просто щось отримуєте і можете використовувати GET, не використовуйте POST, GET кешується (залежно від конфігурації)
polonskyg

18

Це простий код Ajax Request для отримання даних через 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");
    }
});

3
contentType: "application / json; charset = utf-8", я видалив цей рядок, тоді моя проблема вирішена
Taja_100

11

Я відчув подібну складну помилку, яка вимагала двох рішень. У моєму випадку стеком технологій був MVC / ASP.NET / IIS / JQuery. Серверна сторона зазнала помилки з помилкою 500, і це відбулося до того, як контролер обробив запит, ускладнюючи налагодження на стороні сервера.

Наступна налагодження на стороні клієнта дозволила мені визначити помилку сервера

У зворотному дзвінку помилки $ .ajax виведіть детальну інформацію про помилку на консоль

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

Це, принаймні, дозволило мені переглянути початкову помилку сервера

“Запит JSON був занадто великий для серіалізації”

Це було вирішено в клієнтській програмі web.config

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

Однак запит все-таки не вдався. Але цього разу з іншою помилкою, яку я тепер міг налагодити на стороні сервера

“Запит на об’єкт занадто великий”

Це було вирішено шляхом додавання до служби 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>

Значення конфігурації можуть вимагати подальшої настройки, але принаймні це дозволило помилки сервера, викликані повідомленням ajax.


10

Ви можете шукати коди стану HTTP тут (або тут ), ця помилка повідомляє вам:

"Сервер зіткнувся з несподіваною умовою, яка заважала йому виконати запит."

Вам потрібно налагодити ваш сервер.


Дякую, у мене була ця проблема, у файлі дії я не зміг підключитися до бази даних для зберігання даних, тому jQuery post (). Done () отримав помилку 500.
Harkály Gergő

8

Сьогодні я стикаюся з тим самим. Як пропонувалося раніше, завантажте Firebug для Firefox, увімкніть консоль та перегляньте відповідь POST. Це допомогло мені з’ясувати, наскільки дурною була проблема. Моя дія очікувала значення типу int, і я публікував рядок. (ASP.NET MVC2)


6

У EventVwr має бути зареєстрована подія (Попередження з asp.net), яка може надати вам докладнішу інформацію про місце помилки.


4

500 із ASP.NET, ймовірно, означає, що в якийсь момент під час обслуговування запиту було створено необроблений виняток.

Я пропоную вам приєднати налагоджувач до процесу веб-сервера (за умови, що у вас є доступ).

Одна дивна річ: ви робите запит POST на сервер, але не передаєте жодних даних (все є в рядку запиту). Можливо, це має бути замість цього запит GET?

Також слід ще раз перевірити правильність URL-адреси.


Правильно .. Я спочатку використовував GET, але отримую ту саму помилку.
Нік

1
Ви пробували робити запит з адресного рядка браузерів? Ви також отримуєте статус 500?
codeape

3

Я просто стикаюся з цією проблемою сьогодні. при такій помилці ви не отримаєте відповіді від сервера, тому знайти проблему дуже важко.

Але я можу сказати вам, що "500 внутрішня помилка сервера" - це помилка сервера, а не клієнта, ви отримали помилку в сценарії на стороні сервера. Прокоментуйте закриття коду закриттям і спробуйте запустити його знову, незабаром ви дізнаєтесь, що десь вам не вистачає персонажа.


3

Ви також можете отримати цю помилку у VB, якщо функція, яку ви викликаєте, починається із загальнодоступної спільної функції, а не публічної функції у веб-службі. (Як це може статися, якщо ви перемістите або скопіюєте функцію з класу). Просто ще одна річ, на яку слід стежити.


2

Чи можете ви опублікувати підпис свого методу, який повинен прийняти цю публікацію?

Крім того, я отримую одне і те ж повідомлення про помилку, можливо, з іншої причини. Мій YSOD говорив про словник, що не містить значення для ненульового значення. Я отримав інформацію YSOD, щоб поставити точку зупинки у функції $ .ajax, яка обробляла повернення помилки наступним чином:

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

};

Тоді мій javascript errorFunc такий:

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

За допомогою IE я перейшов до меню перегляду -> налагоджувач сценарію -> перерва при наступному висловлюванні. Потім перейшов до запуску коду, який запускав би мою публікацію. Зазвичай це заводило мене десь глибоко всередину бібліотеки jQuery, а не туди, куди я хотів, тому що випадаюче меню, що відкривається, викликало jQuery. Тож я натиснув StepOver, тоді фактичний наступний рядок також зламався б, де я хотів бути. Потім VS переходить на клієнтський (динамічний) режим для цієї сторінки, і я роблю перерву на $("#install")рядку, щоб я міг побачити (за допомогою наведення миші над налагодженням), що було в запиті, textStatus, errorThrown. запит. У request.ResponseText було повідомлення HTML, де я побачив:

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

тож перевірте все це та опублікуйте підпис методу контролера на випадок, якщо це частина проблеми


2

Я виявив цю помилку. У мене було налаштовано переспрямування .htaccess у каталозі. Ну, він перенаправляє виклики ajax до ofcourse ( $.post(../ajax.php)), тому він не може знайти фактичний файл (в результаті 500 помилок).

Я "виправив" це, розмістивши ajax.php у каталозі ( .htaccessщо не вплинуло).


2

Мені вдалося знайти рішення за допомогою налагоджувача Chrome (у мене не встановлено Firebug чи інші сторонні інструменти)

  • Перейдіть на вкладку розробника (CTRL + MAJ + I)
  • Мережа > натисніть на запит, який не вдався, червоним> Попередній перегляд

Це показало мені, що у мене виникла проблема на сервері, коли я повертав значення, яке було посиланням на себе.


2

У моєму випадку це було просте питання, але важко знайти. Директива сторінки мала неправильні атрибути Inherits. Просто потрібно включити найвищий рівень, і це спрацювало.

Невірний код

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

Правильний код

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

1

При використанні фреймворку CodeIgniter із увімкненим захистом CSRF, завантажуйте такий сценарій на кожну сторінку, де може відбутися ajax POST:

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

Потрібні: jQuery та jQuery.cookie плагін

Джерела: https://stackoverflow.com/a/7154317/2539869 та http://jerel.co/blog/2012/03/a-simple-solution-to-codeigniter-csrf-protection-and-ajax


1

Дані JSON, які ви передаєте на сервер, повинні мати те саме ім'я, що і ви, що формуєте на стороні клієнта. Приклад:

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

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

Якщо назва інша, наприклад:

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

Ви отримаєте цю помилку.

Якщо ви не передаєте дані, видаліть атрибут даних із запиту AJAX.


1

У мене виникла ця проблема, і я виявив, що метод C # на стороні сервера повинен бути статичним .

Сторона клієнта:

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

        }

Сторона сервера:

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

Чи можу я отримати приклад про те, як отримати об'єкт JSON та властивості на стороні сервера? Якщо дані: {Prop1: "asdf", Prop2: "zxcv"}, то як я можу отримати значення Prop1 і Prop2 усередині загальнодоступної статичної функції String ListItem_Selected ()? Дякую.
Мехді Аніс,

1

Як уже згадувалося, я думаю, що ваші дані рядка повернення дуже довгі. тому формат JSON пошкоджений.

Існує інший спосіб вирішення цієї проблеми. Вам слід змінити максимальний розмір даних JSON таким чином:

Відкрийте файл Web.Config і вставте ці рядки у розділ конфігурації

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

1

Я теж стикався з тією ж проблемою. Ось два способи, якими я це вирішив - 1. Якщо ви використовуєте якусь структуру, переконайтеся, що ви також надсилаєте маркер CSRF із викликом ajax. Ось як виглядатиме синтаксис для laravel -

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

У вашому файлі js обов’язково зателефонуйте перед тим, як відправити виклик ajax

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. Іншим способом її вирішення буде зміна methodз postнаget

1

Для мене помилка була у файлі php, до якого я надсилав запит. Помилка в підключенні до бази даних. Після виправлення php-коду помилку вирішено.


1

Ваш код містить dataType: json .

У цьому випадку jQuery оцінює відповідь як JSON і повертає об'єкт JavaScript. Дані JSON аналізуються суворо. Будь-який неправильно сформований JSON відхиляється та видається помилка синтаксичного аналізу. Порожня відповідь також відхиляється.

Сервер повинен повернути відповідь nullабо {}замість цього.


1

Я виявив, що це сталося в chrome, коли я зробив два запити ajax в обробнику jquery ' on load ',

тобто подобається $(function() { $.ajax() ... $.ajax() ... });

Я уникав його, використовуючи:

setTimeout(function_to_do_2nd_ajax_request, 1);

це, мабуть, помилка chrome та / або jquery


1

У мене була ця проблема, оскільки на сторінці, яку я зателефонував до ajax post, була EnableViewState="false"іEnableViewStateMac="false" а не сторінка називається.

Коли я розмістив це на обох сторінках, все почало працювати. Я запідозрив це, побачивши виняток MAC-адреси.


0

Дані рядка повернення можуть бути дуже довгими.

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

Наприклад:

  • 1 Char = 1 байт
  • 5 Char = 5 байт
  • "Хаккі" = 5 байт

0

Використовуйте блок Try Catch на стороні сервера, а в блоці catch передайте клієнтові помилку винятку. Це має дати вам корисне повідомлення про помилку.


0

У мене були подібні проблеми з кодом AJAX, який епізодично повертає "500 внутрішніх помилок сервера". Я вирішив проблему, збільшивши значення "fastCGI" RequestTimeout та ActivityTimeout.


Який веб-сервер це стосується? Не могли б ви додати якийсь код?
Макс Леске

0

Я запізнився з цим, але у мене була ця проблема, і я дізнався, що це помилка мого PHP-коду (у моєму випадку синтаксис select до db). Зазвичай ця помилка 500 - це щось робити, використовуючи синтаксис - на мій досвід. Іншими словами: випуск "програмного забезпечення"! : D


0

Як доповнення до відповіді "неправильно сформований JSON", якщо запущений запит повертає об'єкт або щось, що перешкоджає серіалізації даних, ви отримаєте цю помилку. Ви завжди повинні бути впевнені, що у вас є JSON і лише JSON в кінці вашого методу дії або з чого саме ви отримуєте дані.


0

Зазвичай ваше майно не зовсім правильно або щось не так з обробкою вашого сервера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.