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有什么关系?
马特b

是否可以在$ .ajax前面没有$符号或jQuery前缀的情况下正确进行呼叫?
思南2009年

是的。我正在使用jQuery.noConflicts()。前缀正确。就像我说的。它发出请求..但返回错误。
尼克


@shamcs上方的链接在结尾处包含一个字符串,使其无效。正确的链接是developersnote.com/2014/01/...
Erenor拉巴斯

Answers:


67

我怀疑服务器方法在通过断点后会引发异常。使用Firefox / Firebug或IE8开发人员工具查看您从服务器获得的实际响应。如果有例外,您将获得YSOD html,这应有助于您确定要查找的位置。

还有一件事-您的数据属性应为{}而不是“ {}”,前者是空对象,而后者是作为查询参数无效的字符串。更好的是,如果不传递任何数据,则将其删除。


2
您的第一句话具有误导性(暗示500错误发生在客户端)。在我更彻底地阅读答案之前,我几乎拒绝了您的投票。您可能需要澄清一下。
Macha

4
fiddler2.com在查看服务器的实际响应时也非常有用。
Glen Little 2010年

:o Chrome开发工具实际上不符合要求!
吉米

1
实际上,您可以在Chrome中调试它,请查看此答案以获取详细信息stackoverflow.com/a/21786593/14533
Pixelomo 2016年

33

如果有人使用codeigniter框架,则问题可能是由启用csrf保护配置引起的。


7
几分钟前我才遇到这个问题...您的回答给了我提示:)可能对此很有趣,可以避免其他人将其添加到数据中可以解决问题:<?= $ this-> security-> get_csrf_token_name()吗? >:'<?= $ this-> security-> get_csrf_hash()?>'
跳水运动员2012年

谢谢,在Bonfire中陷入了困境,并且对CodeIgniter的了解还不够深,无法弄清这一点。
andyface 2013年

19

我只是有这个问题我自己,尽管我找不到原因,它在我的情况下,从改变时POSTGET,问题500错误消失了!

 type:'POST'

9
但不是真正的解决方案。有些事情必须发布
-atilkan

2
那是完全错误的。如果将POST更改为GET确实可行,那么您首先使用的是不正确的HTTPVerb。如果由于例如要发送有效负载而必须使用POST,则必须使用POST,而不能使用GET。另一方面,如果您只是得到一些东西并且可以使用GET,则不使用POST,则GET将被缓存(有时取决于配置)
polonskyg 2015年

18

这是通过Ajax请求获取数据的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”,我删除了这一行,然后解决了我的问题
Taja_100 '16

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ályGergő

8

我今天碰到同样的事情。按照获取适用于Firefox的Firebug之前的建议,启用控制台并预览POST响应。那帮助我发现问题有多愚蠢。我的行为是期望类型为int的值,并且我正在发布字符串。(ASP.NET MVC2)


6

应该在EventVwr中记录一个事件(来自asp.net的警告),该事件可以为您提供有关错误发生位置的更多详细信息。


4

来自ASP.NET的500可能意味着在处理请求时在某个时候引发了未处理的异常。

我建议您将调试器附加到Web服务器进程(假设您具有访问权限)。

一件奇怪的事:您向服务器发出POST请求,但没有传递任何数据(所有内容都在查询字符串中)。也许应该是GET请求呢?

您还应该仔细检查网址是否正确。


是的..我最初使用的是GET,但出现相同的错误。
尼克,

1
您是否尝试过从浏览器地址栏中进行请求?您还会获得500状态吗?
codeape

3

我今天只是面对这个问题。遇到这种错误,您将无法从服务器获得任何响应,因此,很难找到问题所在。

但是我可以告诉您“ 500内部服务器错误”是服务器而不是客户端的错误,您在服务器端脚本中遇到了错误。通过关闭注释掉代码关闭,然后尝试再次运行它,您很快就会发现您错过了某个字符。


3

如果您要调用的函数以Web服务中的Public Shared Function(而不是Public Function)开头,那么您也可以在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
        });

};

然后我的errorFunc javascript是这样的:

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调用重新路由到当然($.post(../ajax.php)),因此找不到实际文件(导致500错误)。

我通过将ajax.php放在目录中来“修复”它(因此.htaccess没有影响)。


2

我可以使用Chrome调试器找到解决方案(我没有安装Firebug或其他第三方工具)

  • 转到开发人员标签(CTRL + MAJ + I)
  • 网络>单击失败的请求,以红色>预览

当我返回一个自引用的值时,它表明我在服务器上遇到问题。


2

就我而言,这是一个简单的问题,但很难找到。Page指令的Inherits属性错误。它只需要包括顶层即可,并且有效。

错误的代码

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

正确的代码

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


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#方法应该是static

客户端:

$.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”},那么如何在公共静态String ListItem_Selected()函数中获取Prop1和Prop2值?谢谢。
Mehdi Anis

1

如前所述,我认为您的返回字符串数据非常长。因此JSON格式已损坏。

还有另一种方法可以解决此问题。您应该通过以下方式更改JSON数据的最大大小:

打开Web.Config文件并将这些行粘贴到配置部分

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

1

我也面临同样的问题。以下是我解决问题的两种方法:1.如果使用的是框架,请确保同时发送带有ajax调用的CSRF令牌这是laravel的语法:

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

在您的js文件中,请确保在发送ajax调用之前先调用此命令

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. 解决这个问题的另一种方法是改变method来自postget

1

对我来说,错误是在我向其发送请求的php文件中。数据库连接出错。修复php代码后,错误已解决。


1

您的代码包含dataType:json

在这种情况下,jQuery将响应评估为JSON并返回一个JavaScript对象。的JSON数据以严格的方式解析。任何格式错误的JSON拒绝错误的并引发解析错误。空响应也将被拒绝。

服务器应返回null或的响应{}


1

当我在加载时在jquery中执行两个ajax查询时,我发现这发生在chrome中”处理程序

即喜欢 $(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个字符= 1个字节
  • 5个字符= 5个字节
  • “ Hakki” = 5字节

0

在服务器端使用Try Catch块,然后在catch块中将异常错误传回给客户端。这应该给您有用的错误消息。


0

我在AJAX代码中遇到过类似的问题,偶尔会返回“ 500内部服务器错误”。我通过增加“ fastCGI” RequestTimeout和ActivityTimeout值解决了该问题。


该关注哪个Web服务器?您能添加一些代码吗?
Max Leske

0

我对此很迟,但是我遇到了这个问题,据我了解,这是我的PHP代码出现错误(在我的情况下,是选择数据库的语法)。通常,根据我的经验,此错误500是使用语法执行的操作。换句话说:“人为”问题!:D


0

除了“格式错误的JSON”答案外,如果您正在运行的查询返回一个对象或任何阻止数据序列化的内容,您将收到此错误。您应该始终确保在操作方法的末尾具有JSON,并且只有JSON或从中获取数据的任何方法。


0

通常,您的财产不完全正确或服务器处理出现问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.