JQuery Ajax 发送 Post 请求导致 500 内部服务器错误

91

我正在尝试执行这个AJAX post请求,但是出现了服务器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
能否在“.ajax”前面不加$符号或jQuery前缀的情况下正确调用它? - Sinan
是的,我正在使用jQuery.noConflicts()。前缀是正确的。就像我说的那样,它发出了请求...但是返回了错误。 - Nick
请查看此处的文章:http://www.developersnote.com/2014/01/solved-jquery-ajax-500-internal-server.html - shamcs
上面的链接@shamcs包含一个字符串,使其无效。正确的链接是http://www.developersnote.com/2014/01/solved-jquery-ajax-500-internal-server.html。 - Erenor Paz
我遇到了同样的问题 - 在我的情况下,我不得不在我的php脚本中禁用error_reporting,因此我的表单被提交了两次 -> 抛出500个内部服务器错误。 - Kerim Yagmurcu
33个回答

73

我怀疑服务器方法在通过您的断点后抛出了异常。使用Firefox / Firebug或IE8开发人员工具查看实际从服务器获取的响应。如果发生异常,您将获得YSOD HTML,这应该可以帮助您找到要查找的位置。

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


2
你的第一句话有误导性(暗示500错误是在客户端发生的)。在我仔细阅读答案之前,我差点就要给你点个踩。你可能需要澄清一下。 - Macha
4
http://www.fiddler2.com/非常有用,可以查看服务器返回的实际响应。 - Glen Little
Chrome Dev Tools实际上有所不足的地方! - Jimmy
1
实际上您可以在 Chrome 中进行调试,查看此答案以了解详情:https://dev59.com/iHbZa4cB1Zd3GeqPGHYG#21786593 - Pixelomo

35

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


8
我几分钟前遇到了这个问题...你的答案给了我提示 :) 或许对于其他人来说也很有用,可以避免这个问题。 将以下内容添加到数据中可以解决问题: <?= $ this->security->get_csrf_token_name() ?>:'<?= $ this->security->get_csrf_hash() ?>' - soupdiver
谢谢,我在Bonfire上遇到了困难,还不够熟悉CodeIgniter来解决这个问题。 - andyface

20

这是一个使用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
如果你仍然使用那行代码会怎样?@Taja_100 - gumuruh

19

我自己也遇到了这个问题,尽管在我的情况下我找不到原因,但当我从POST更改为GET时,问题 500 错误消失了!

 type:'POST'

12
但这并不是一个真正的解决方案。有些事情必须被提交。 - atilkan
2
这完全是错误的。如果将POST更改为GET确实起作用,那么您最初使用的HTTPVerb是不正确的。如果必须使用POST,例如您正在发送有效负载,则必须使用POST,使用GET将无法正常工作。另一方面,如果您只是获取某些内容并且可以使用GET,请勿使用POST,因为GET会被缓存(有时取决于配置)。 - polonskyg

17

我遇到了一个类似的复合错误,需要两个解决方案。 在我的情况下,技术栈是MVC / ASP.NET / IIS / JQuery。 服务器端出现500错误,这发生在控制器处理请求之前,使得服务器端调试困难。

通过以下客户端调试,我能够确定服务器错误

在$.ajax error回调中,将错误详细信息显示到控制台

  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提交引起的服务器错误。


我刚刚有些困惑,是需要在服务器的web.config还是客户端的web.config中添加呢? 另外,您能否解释一下这段代码是如何工作的,这将非常有帮助。我按照您在这里提到的方式打印日志,但它说字符串的长度超过了maxJson长度属性设置的值。 - Kedar Ghadge

10
你可以在这里(或这里)查找HTTP状态码,这个错误告诉你:
"服务器遇到意外情况,无法完成请求。"
你需要调试你的服务器。

谢谢,我遇到了这个问题,在操作文件中我无法连接到数据库来存储数据,所以jQuery post().done()出现了500错误。 - Harkály Gergő

9

今天我也遇到了同样的问题。之前建议使用Firefox的Firebug工具,启用控制台并预览POST响应。这帮助我找出了问题有多傻。我的操作期望得到一个int类型的值,但我却发送了一个字符串。(ASP.NET MVC2)


7

在事件查看器中应该记录了一个事件(来自asp.net的警告),它可以提供更多关于错误发生位置的详细信息。


5
我今天遇到了这个问题。出现这种错误时,您将无法从服务器获得任何响应,因此很难定位问题。
但是我可以告诉您,“500内部服务器错误”是服务器错误而不是客户端错误,您在服务器端脚本中出现了错误。逐步注释掉代码并尝试再次运行,您很快就会发现某个地方缺少一个字符。

5

如果来自ASP.NET的500错误,可能意味着在处理请求时出现未处理的异常。

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

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

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


没错,我最初使用的是GET方法,但我仍然遇到了同样的错误。 - Nick
1
你尝试过从浏览器地址栏发送请求吗?你也会得到500状态吗? - codeape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接