JQuery Ajax Post dẫn đến lỗi 500 Internal Server Error


81

Tôi đang cố gắng thực hiện bài đăng AJAX này nhưng vì một số lý do, tôi gặp lỗi máy chủ 500. Tôi có thể thấy nó đạt điểm ngắt trong bộ điều khiển. Vì vậy, vấn đề dường như nằm ở cuộc gọi lại. Bất kỳ ai?

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

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

Đây là chuỗi sẽ được trả về:

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

.ashx = Nền tảng .NET? Điều này có liên quan gì đến Java?
matt b

có thể thực hiện cuộc gọi một cách chính xác mà không có dấu $ hoặc tiền tố jQuery trước ".ajax" không?
Sinan

Có .. Tôi đang sử dụng jQuery.noConflicts (). Tiền tố là chính xác. Như tôi đã nói. Nó thực hiện yêu cầu .. nhưng lỗi được trả lại.
Nick

Kiểm tra bài đăng tại đây developernote.com/2014/01/…
shamcs

Liên kết ở trên từ @shamcs chứa một chuỗi ở cuối khiến nó không hợp lệ. Các liên kết đúng là developersnote.com/2014/01/...
Erenor Paz

Câu trả lời:


67

Tôi nghi ngờ rằng phương thức máy chủ đang ném một ngoại lệ sau khi nó vượt qua điểm ngắt của bạn. Sử dụng Firefox / Firebug hoặc các công cụ dành cho nhà phát triển IE8 để xem phản hồi thực tế mà bạn nhận được từ máy chủ. Nếu có một ngoại lệ, bạn sẽ nhận được html YSOD, mã này sẽ giúp bạn tìm ra nơi cần tìm.

Một điều nữa - thuộc tính dữ liệu của bạn phải là {} không phải "{}", thuộc tính trước là một đối tượng trống trong khi thuộc tính sau là một chuỗi không hợp lệ dưới dạng tham số truy vấn. Tốt hơn, chỉ cần bỏ nó ra nếu bạn không chuyển bất kỳ dữ liệu nào.


2
Câu đầu tiên của bạn gây hiểu lầm (ngụ ý lỗi 500 đang xảy ra ở phía máy khách). Tôi gần như đã bỏ phiếu cho bạn cho nó trước khi tôi đọc câu trả lời kỹ hơn. Bạn có thể muốn làm rõ một chút.
Macha

4
fiddler2.com cũng rất hữu ích để xem phản hồi thực tế từ máy chủ.
Glen Little

: o cái gì đó mà Chrome Dev Tools thực sự thiếu sót!
Jimmy

1
thực sự bạn có thể gỡ lỗi này trong Chrome, hãy kiểm tra câu trả lời này để biết chi tiết stackoverflow.com/a/21786593/14533
Pixelomo

33

trong trường hợp nếu ai đó sử dụng khung mã hóa, sự cố có thể do cấu hình bảo vệ csrf được kích hoạt.


7
Tôi vừa mới đi vào vấn đề này vài phút trước ... câu trả lời của bạn đã cho tôi gợi ý :) Có thể thú vị cho những người khác để tránh điều này Thêm điều này vào dữ liệu giải quyết vấn đề: <? = $ This-> security-> get_csrf_token_name ()? >: '<? = $ this-> security-> get_csrf_hash ()?>'
soupdiver 14/03/12

Cảm ơn bạn, đã gặp khó khăn về vấn đề này trong Bonfire và không biết CodeIgniter đủ rõ để tìm ra điều đó.
andyface

19

Tôi vừa gặp sự cố này, mặc dù tôi không thể tìm ra lý do cho nó trong trường hợp của mình, nhưng khi chuyển từ POSTsang GET, lỗi 500 đã biến mất!

 type:'POST'

9
nhưng không phải là một giải pháp thực sự. Một số điều cần phải được POST
atilkan

2
Điều đó hoàn toàn sai lầm. Nếu việc thay đổi POST thành GET thực sự hiệu quả thì ngay từ đầu bạn đã sử dụng HTTPVerb không chính xác. Nếu bạn phải sử dụng POST vì ví dụ: bạn đang gửi trọng tải, bạn phải sử dụng POST và sử dụng GET sẽ không hoạt động. Và mặt khác nếu bạn chỉ nhận được một cái gì đó và có thể sử dụng GET, không sử dụng POST, GET bị lưu trữ (tùy thuộc vào cấu hình đôi khi)
polonskyg

18

Đây là Yêu cầu Ajax Mã đơn giản để tìm nạp dữ liệu thông qua yêu cầu 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", tôi đã xóa dòng này thì vấn đề của tôi đã được giải quyết
Taja_100 8/12/16

11

Tôi đã gặp một lỗi phức hợp tương tự, yêu cầu hai giải pháp. Trong trường hợp của tôi, ngăn xếp công nghệ là MVC / ASP.NET / IIS / JQuery. Phía máy chủ không thành công với lỗi 500 và điều này xảy ra trước khi yêu cầu được xử lý bởi bộ điều khiển, làm cho việc gỡ lỗi ở phía máy chủ trở nên khó khăn.

Gỡ lỗi phía máy khách sau cho phép tôi xác định lỗi máy chủ

Trong lệnh gọi lại lỗi $ .ajax, hiển thị chi tiết lỗi trên bảng điều khiển

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

Điều này ít nhất đã cho phép tôi xem lỗi máy chủ ban đầu

“Yêu cầu JSON quá lớn để được đăng nhiều kỳ”

Điều này đã được giải quyết trong web.config máy khách

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

Tuy nhiên, yêu cầu vẫn không thành công. Nhưng lần này với một lỗi khác mà hiện tôi đã có thể gỡ lỗi ở phía máy chủ

“Đối tượng yêu cầu quá lớn”

Điều này đã được giải quyết bằng cách thêm phần sau vào dịch vụ 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>

Các giá trị cấu hình có thể yêu cầu điều chỉnh thêm, nhưng ít nhất nó đã giải quyết được các lỗi máy chủ do bài ajax gây ra.


10

Bạn có thể tra cứu mã trạng thái HTTP tại đây (hoặc tại đây ), lỗi này báo cho bạn biết:

"Máy chủ gặp phải tình trạng không mong muốn khiến máy chủ không thể thực hiện yêu cầu."

Bạn cần gỡ lỗi máy chủ của mình.


Cảm ơn, tôi đã gặp sự cố này, trong tệp hành động, tôi không thể kết nối với cơ sở dữ liệu để lưu trữ dữ liệu nên jQuery post (). Done () gặp lỗi 500.
Harkály Gergő

8

Tôi gặp phải điều tương tự ngày hôm nay. Như đã đề xuất trước khi tải Firebug cho Firefox, Bật Bảng điều khiển và xem trước phản hồi ĐĂNG. Điều đó đã giúp tôi tìm ra vấn đề ngu ngốc đến mức nào. Hành động của tôi mong đợi giá trị của kiểu int và tôi đang đăng chuỗi. (ASP.NET MVC2)


6

Sẽ có một sự kiện được ghi vào EventVwr (Cảnh báo từ asp.net), điều này có thể cung cấp cho bạn thêm chi tiết về nơi có thể xảy ra lỗi.


4

500 từ ASP.NET có thể có nghĩa là một ngoại lệ chưa được xử lý đã được ném vào một thời điểm nào đó khi phục vụ yêu cầu.

Tôi đề nghị bạn đính kèm trình gỡ lỗi vào quy trình máy chủ web (giả sử bạn có quyền truy cập).

Một điều kỳ lạ: Bạn thực hiện một yêu cầu POST đến máy chủ, nhưng bạn không chuyển bất kỳ dữ liệu nào (mọi thứ đều nằm trong chuỗi truy vấn). Có lẽ nó phải là một yêu cầu GET thay thế?

Bạn cũng nên kiểm tra lại xem URL có đúng không.


Đúng .. Tôi đã sử dụng GET ban đầu nhưng tôi gặp lỗi tương tự.
Nick

1
Bạn đã thử thực hiện yêu cầu từ thanh địa chỉ của trình duyệt chưa? Bạn có nhận được trạng thái 500 sau đó không?
codeape

3

Tôi chỉ phải đối mặt với vấn đề này ngày hôm nay. với loại lỗi này, bạn sẽ không nhận được bất kỳ phản hồi nào từ máy chủ, do đó, rất khó để xác định vấn đề.

Nhưng tôi có thể cho bạn biết "Lỗi máy chủ nội bộ 500" là lỗi với máy chủ không phải máy khách, bạn đã gặp lỗi trong tập lệnh phía máy chủ. Nhận xét về việc đóng mã bằng cách đóng và thử chạy lại, bạn sẽ sớm phát hiện ra mình bỏ sót một ký tự ở đâu đó.


3

Bạn cũng có thể gặp lỗi đó trong VB nếu hàm bạn đang gọi bắt đầu bằng Hàm chia sẻ công khai thay vì Hàm công khai trong dịch vụ web. (Có thể xảy ra nếu bạn di chuyển hoặc sao chép hàm ra khỏi một lớp). Chỉ cần một điều khác để xem cho.


2

Bạn có thể đăng chữ ký của phương pháp được cho là chấp nhận bài đăng này không?

Ngoài ra, tôi nhận được thông báo lỗi tương tự, có thể vì một lý do khác. YSOD của tôi đã nói về việc từ điển không chứa giá trị cho giá trị không thể nullable. Cách tôi nhận được thông tin YSOD là đặt một điểm ngắt trong hàm $ .ajax để xử lý trả về lỗi như sau:

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

};

Sau đó, javascript errorFunc của tôi như thế này:

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

Sử dụng IE, tôi vào menu xem -> trình gỡ lỗi tập lệnh -> ngắt ở câu lệnh tiếp theo. Sau đó, kích hoạt mã sẽ khởi chạy bài đăng của tôi. Điều này thường đưa tôi đến một nơi nào đó sâu bên trong thư viện của jQuery thay vì nơi tôi muốn, bởi vì việc mở chọn thả xuống đã kích hoạt jQuery. Vì vậy, tôi nhấn StepOver, sau đó dòng tiếp theo thực sự cũng sẽ bị phá vỡ, đó là nơi tôi muốn. Sau đó, VS chuyển sang chế độ phía máy khách (động) cho trang đó và tôi đặt một khoảng ngắt $("#install")dòng để tôi có thể xem (sử dụng chuột qua gỡ lỗi) những gì được yêu cầu, textStatus, errorThrown. yêu cầu. Trong request.ResponseText, có một thông báo html mà tôi thấy:

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

vì vậy hãy kiểm tra tất cả những điều đó và đăng chữ ký phương thức bộ điều khiển của bạn trong trường hợp đó là một phần của sự cố


2

Tôi thấy mình có lỗi này. Tôi đã định cấu hình chuyển hướng .htaccess trong một thư mục. Vâng, nó định tuyến lại các cuộc gọi ajax thành tất nhiên ($.post(../ajax.php) ), vì vậy nó không thể tìm thấy tệp thực (dẫn đến lỗi 500).

Tôi đã 'sửa' nó bằng cách đặt ajax.php vào một thư mục (Vì vậy, .htaccesskhông ảnh hưởng).


2

Tôi có thể tìm thấy giải pháp bằng cách sử dụng trình gỡ lỗi Chrome (Tôi chưa cài đặt Firebug hoặc các công cụ của bên thứ ba khác)

  • Chuyển đến tab nhà phát triển (CTRL + MAJ + I)
  • Mạng > nhấp vào yêu cầu không thành công, màu đỏ> Xem trước

Nó cho tôi thấy rằng tôi đã gặp sự cố trên máy chủ, khi tôi đang trả về một giá trị tự tham chiếu.


2

Trong trường hợp của tôi, đó là một vấn đề đơn giản, nhưng khó tìm. Chỉ thị trang có thuộc tính Kế thừa sai. Nó chỉ cần bao gồm cấp cao nhất và nó đã hoạt động.

Sai mã

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

Đúng mã

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

1

Khi sử dụng khung CodeIgniter với tính năng bảo vệ CSRF được bật, hãy tải tập lệnh sau vào mỗi trang nơi có thể xảy ra ajax POST:

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

Yêu cầu: jQuery và jQuery.cookie plugin

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


1

Dữ liệu JSON bạn đang chuyển tới máy chủ phải có cùng tên với tên bạn tạo ở phía máy khách. Ví dụ:

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

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

Nếu tên khác, ví dụ:

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

Bạn sẽ gặp lỗi này.

Nếu bạn không chuyển dữ liệu, hãy xóa thuộc tính dữ liệu khỏi yêu cầu AJAX.


1

Tôi gặp sự cố này và phát hiện ra rằng phương thức C # phía máy chủ phải là tĩnh .

Phía khách hàng:

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

        }

Phía máy chủ:

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

Tôi có thể lấy một ví dụ về Cách lấy đối tượng JSON và thuộc tính ở phía máy chủ không? Nếu dữ liệu: {Prop1: "asdf", Prop2: "zxcv"} thì Làm cách nào để lấy các giá trị Prop1 và Prop2 bên trong hàm String static ListItem_Selected () công khai? Cảm ơn.
Mehdi Anis

1

Như đã đề cập, tôi nghĩ rằng dữ liệu chuỗi trả về của bạn rất dài. vì vậy định dạng JSON đã bị hỏng.

Có một cách khác cho vấn đề này. Bạn nên thay đổi kích thước tối đa cho dữ liệu JSON theo cách này:

Mở tệp Web.Config và dán các dòng này vào phần cấu hình

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

1

Tôi cũng phải đối mặt với vấn đề tương tự. Đây là hai cách mà tôi đã giải quyết nó- 1. Nếu bạn đang sử dụng một số khung công tác, hãy đảm bảo rằng bạn cũng đang gửi mã thông báo CSRF với lệnh gọi ajax Đây là cách cú pháp sẽ giống như laravel -

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

Trong tệp js của bạn, hãy đảm bảo gọi cái này trước khi gửi lệnh gọi ajax

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. Một cách khác để giải quyết nó sẽ được thay đổi methodtừ postđếnget

1

Đối với tôi, lỗi là trong tệp php mà tôi đang gửi yêu cầu. Lỗi trong kết nối cơ sở dữ liệu. Sau khi sửa mã php, lỗi đã được giải quyết.


1

Mã của bạn chứa dataType: json .

Trong trường hợp này, jQuery đánh giá phản hồi là JSON và trả về một đối tượng JavaScript. Các JSON dữ liệu được phân tích một cách nghiêm ngặt. Mọi JSON không đúng định dạng đều bị từ chối và lỗi phân tích cú pháp được đưa ra. Một phản hồi trống cũng bị từ chối.

Máy chủ sẽ trả về phản hồi của nullhoặc {}thay thế.


1

Tôi thấy điều này xảy ra trong chrome khi tôi thực hiện hai truy vấn ajax trong trình xử lý jquery ' khi tải ',

tức là thích $(function() { $.ajax() ... $.ajax() ... });

Tôi đã tránh nó bằng cách sử dụng:

setTimeout(function_to_do_2nd_ajax_request, 1);

có lẽ đó là một lỗi chrome và / hoặc jquery


1

Tôi gặp sự cố này vì trang mà tôi gọi là bài đăng ajax có EnableViewState="false"EnableViewStateMac="false" nhưng không phải trang được gọi.

Khi tôi đặt nó trên cả hai trang, mọi thứ bắt đầu hoạt động. Tôi nghi ngờ điều này khi tôi thấy ngoại lệ địa chỉ MAC.


0

Dữ liệu chuỗi trả về của bạn có thể rất dài.

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

Ví dụ:

  • 1 Char = 1 Byte
  • 5 Char = 5 Byte
  • "Hakki" = 5 Byte

0

Sử dụng khối Thử bắt ở phía máy chủ của bạn và trong khối bắt được trả lại lỗi ngoại lệ cho máy khách. Điều này sẽ cung cấp cho bạn một thông báo lỗi hữu ích.


0

Tôi đã gặp sự cố tương tự với mã AJAX mà thường xuyên trả về "lỗi máy chủ nội bộ 500". Tôi đã giải quyết sự cố bằng cách tăng giá trị RequestTimeout và ActivityTimeout "fastCGI".


Máy chủ web nào có mối quan tâm đó? Bạn có thể thêm một số mã xin vui lòng?
Max Leske

0

Tôi đã muộn về điều này, nhưng tôi đã gặp sự cố này và những gì tôi biết được rằng đó là một lỗi trên mã PHP của tôi (trong trường hợp của tôi là cú pháp của một lựa chọn đối với db). Thông thường lỗi 500 này là một cái gì đó để làm bằng cách sử dụng cú pháp - theo kinh nghiệm của tôi. Nói cách khác: vấn đề "phần mềm con người"! : D


0

Như một phần bổ sung cho câu trả lời "JSON không đúng định dạng", nếu truy vấn bạn đang chạy trả về một đối tượng hoặc bất kỳ thứ gì ngăn cản dữ liệu được tuần tự hóa, bạn sẽ gặp lỗi này. Bạn phải luôn chắc chắn rằng bạn có JSON và chỉ JSON ở cuối phương thức hành động của bạn hoặc bất cứ điều gì bạn đang lấy dữ liệu từ đó.


0

Thông thường thuộc tính của bạn không hoàn toàn đúng hoặc có gì đó sai với quá trình xử lý máy chủ của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.