Development Tip

JQuery Ajax Post 결과 500 내부 서버 오류 발생

yourdevel 2020. 10. 20. 08:13
반응형

JQuery Ajax Post 결과 500 내부 서버 오류 발생


이 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'}

중단 점을 통과 한 후 서버 메서드가 예외를 던지고 있다고 생각합니다. Firefox / Firebug 또는 IE8 개발자 도구를 사용하여 서버에서받는 실제 응답을 확인합니다. 예외가있는 경우 YSOD html을 받게되며, 이는 어디를 찾아야하는지 파악하는 데 도움이됩니다.

한 가지 더-데이터 속성은 "{}"가 아닌 {}이어야합니다. 전자는 빈 객체이고 후자는 쿼리 매개 변수로 유효하지 않은 문자열입니다. 더 좋은 방법은 데이터를 전달하지 않는 경우에는 그대로 두는 것입니다.


누군가 codeigniter 프레임 워크를 사용하는 경우 csrf 보호 구성이 활성화되어 문제가 발생할 수 있습니다.


이 문제가 발생했습니다. 제 경우에는 그 이유를 찾을 수 없었지만에서 POST변경 GET하면 문제 500 오류가 사라졌습니다!

 type:'POST'

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

여기 (또는 여기 )에서 HTTP 상태 코드를 찾을 수 있습니다 .이 오류는 다음을 알려줍니다.

"서버에 예상치 못한 상황이 발생하여 요청을 이행하지 못했습니다."

서버를 디버그해야합니다.


두 가지 해결책이 필요한 유사한 복합 오류가 발생했습니다. 제 경우에는 기술 스택이 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 게시물로 인한 서버 오류를 해결했습니다.


오늘도 똑같은 일이 발생합니다. Firefox 용 Firebug를 받기 전에 제안한대로 콘솔을 활성화하고 POST 응답을 미리 봅니다. 그 문제가 얼마나 어리석은 지 알아내는 데 도움이되었습니다. 내 행동은 int 유형의 값을 기대하고 있었고 문자열을 게시했습니다. (ASP.NET MVC2)


EventVwr (asp.net의 경고)에 기록 된 이벤트가 있어야 오류가 발생할 수있는 위치에 대한 자세한 정보를 제공 할 수 있습니다.


ASP.NET의 500은 요청을 처리 할 때 처리되지 않은 예외가 발생했음을 의미합니다.

디버거를 웹 서버 프로세스에 연결하는 것이 좋습니다 (액세스 권한이 있다고 가정).

한 가지 이상한 점 : 서버에 POST 요청을했지만 데이터를 전달하지 않습니다 (모든 것이 쿼리 문자열에 있음). 대신 GET 요청이어야할까요?

또한 URL이 올바른지 다시 확인해야합니다.


나는 오늘이 문제에 직면했다. 이런 종류의 오류가 발생하면 서버에서 응답을받지 못하므로 문제를 찾기가 매우 어렵습니다.

하지만 "500 내부 서버 오류"는 클라이언트가 아닌 서버 오류입니다. 서버 측 스크립트에 오류가 있습니다. 클로저로 코드 클로저를 주석 처리하고 다시 실행 해보십시오. 곧 어딘가에서 문자를 놓친다는 것을 알게 될 것입니다.


호출하는 함수 가 웹 서비스의 공용 함수아닌 공용 공유 함수로 시작하는 경우 VB에서 해당 오류가 발생할 수도 있습니다 . (클래스에서 함수를 이동하거나 복사하는 경우 발생할 수 있습니다.) 주목해야 할 또 다른 것.


이 게시물을 수락해야하는 방법의 서명을 게시 할 수 있습니까?

또한 다른 이유로 인해 동일한 오류 메시지가 표시됩니다. 내 YSOD는 nullable이 아닌 값을 포함하지 않는 사전에 대해 이야기했습니다. 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
        });

};

그런 다음 내 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>

그래서 모든 것을 확인하고 문제의 일부인 경우 컨트롤러 메서드 서명을 게시하십시오.


나는이 오류가 있음을 발견했습니다. 디렉토리에 .htaccess 리디렉션이 구성되어 있습니다. 아약스 호출을 ofcourse ( $.post(../ajax.php)) 로 다시 라우팅 하므로 실제 파일을 찾을 수 없습니다 (결과 500 오류).

ajax.php를 디렉토리에 배치하여 '수정'했습니다 (따라서 .htaccess영향을주지 않았습니다).


Chrome 디버거를 사용하여 솔루션을 찾을 수있었습니다 (Firebug 또는 기타 타사 도구가 설치되어 있지 않음)

  • 개발자 탭으로 이동 (CTRL + MAJ + I)
  • 네트워크 > 실패한 요청을 빨간색으로 클릭> 미리보기

자체 참조 값을 반환 할 때 서버에 문제가 있음을 보여주었습니다.


제 경우에는 간단한 문제 였지만 찾기가 어려웠습니다. 페이지 지시문에 잘못된 상속 속성이 있습니다. 최상위 레벨 만 포함하면됩니다.

잘못된 코드

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

올바른 코드

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

CSRF 보호가 활성화 된 CodeIgniter 프레임 워크를 사용하는 경우 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/2539869http://jerel.co/blog/2012/03/a-simple-solution-to-codeigniter-csrf-protection-and-ajax


서버에 전달하는 JSON 데이터는 클라이언트 측에서 생성 한 것과 동일한 이름을 가져야합니다. 전의:

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

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

이름이 다른 경우 예 :

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

이 오류가 발생합니다.

데이터를 전달하지 않는 경우 AJAX 요청에서 데이터 속성을 제거하십시오.


이 문제가 발생하여 서버 측 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 형식이 손상되었습니다.

이 문제에는 다른 방법이 있습니다. 다음과 같이 JSON 데이터의 최대 크기를 변경해야합니다.

Web.Config 파일을 열고이 행을 구성 섹션에 붙여 넣으십시오.

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

나는 또한 같은 문제에 직면했다. 다음은 내가 해결 한 두 가지 방법입니다. 1. 일부 프레임 워크를 사용하는 경우 ajax 호출과 함께 CSRF 토큰도 전송하고 있는지 확인하십시오. 다음은 laravel의 구문이 어떻게 보이는지입니다.

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

js 파일에서 ajax 호출을 보내기 전에 이것을 호출하십시오.

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. 이를 해결하는 또 다른 방법은에서로 변경 method하는 post것입니다.get

For me, the error was in php file to which i was sending request. Error was in database connectivity. After fixing the php code, error resolved.


Your code contains dataType: json.

In this case jQuery evaluates the response as JSON and returns a JavaScript object. The JSON data is parsed in a strict manner. Any malformed JSON is rejected and a parse error is thrown. An empty response is also rejected.

The server should return a response of null or {} instead.


I found this occurred in chrome when I did two ajax queries in the jquery 'on load' handler,

i.e. like $(function() { $.ajax() ... $.ajax() ... });

I avoided it using:

setTimeout(function_to_do_2nd_ajax_request, 1);

it's presumably a chrome and/or jquery bug


I had this problem because the page I called ajax post from had EnableViewState="false" and EnableViewStateMac="false" but not the page called.

When I put this on both pages everything started to work. I suspected this when I saw MAC address exception.


Your return string data can be very long.

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

For example:

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

Use a Try Catch block on your server side and in the catch block pass back the exception error to the client. This should give you a helpful error message.


I have had similar issues with AJAX code that sporadically returns the "500 internal server error". I resolved the problem by increasing the "fastCGI" RequestTimeout and ActivityTimeout values.


I'm late on this, but I was having this issue and what I've learned was that it was an error on my PHP code (in my case the syntax of a select to the db). Usually this error 500 is something to do using syntax - in my experience. In other word: "peopleware" issue! :D


As an addition to the "malformed JSON" answer, if the query you are running returns an object or anything that prevents the data to be serialised, you will get this error. You should always be sure you have JSON and only JSON at the end of your action method or whatever it is you are getting the data from.

참고URL : https://stackoverflow.com/questions/1349118/jquery-ajax-post-results-in-500-internal-server-error

반응형