JQuery Ajax Post导致500内部服务器错误

时间:2009-08-28 20:17:02

标签: javascript jquery ajax

我正在尝试执行此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'}

31 个答案:

答案 0 :(得分:65)

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

还有一件事 - 您的数据属性应该是{}而不是“{}”,前者是空对象,而后者是作为查询参数无效的字符串。更好的是,如果你没有传递任何数据,就把它留下来。

答案 1 :(得分:29)

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

答案 2 :(得分:18)

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

 type:'POST'

答案 3 :(得分:15)

这是通过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");
    }
});

答案 4 :(得分:10)

您可以查找HTTP状态代码here(或here),此错误告诉您:

“服务器遇到意外情况,导致无法完成请求。”

您需要调试服务器。

答案 5 :(得分:8)

我今天碰到了同样的事情。如前所述,获取Firebug for Firefox,启用控制台并预览POST响应。这帮助我找出问题是多么愚蠢。我的行动是期望int类型的值,我发布了字符串。 (ASP.NET MVC2)

答案 6 :(得分:8)

我遇到了类似的复合错误,需要两个解决方案。在我的例子中,技术堆栈是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帖子导致的服务器错误。

答案 7 :(得分:6)

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

答案 8 :(得分:4)

来自ASP.NET的500可能意味着在提供请求时在某个时刻抛出了未处理的异常。

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

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

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

答案 9 :(得分:3)

我今天刚遇到这个问题。有了这种错误,您将无法从服务器获得任何响应,因此,很难找到问题。

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

答案 10 :(得分:3)

如果您调用的功能以网络服务中的公共共享功能而非公共功能开头,您也可以在VB中获得该错误。 (如果您将某个功能移出或复制出课程,可能会发生这种情况)。另一件需要注意的事情。

答案 11 :(得分: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我去了查看菜单 - &gt;脚本调试器 - &gt;在下一个声明中休息。 然后去触发将发布我的帖子的代码。这通常会让我深入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>

所以检查所有这些,并发布您的控制器方法签名,以防这是问题的一部分

答案 12 :(得分:2)

我发现自己有这个错误。我在目录中配置了.htaccess重定向。好吧,它重新路由ajax调用tocourse($.post(../ajax.php)),因此无法找到实际文件(导致500错误)。

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

答案 13 :(得分:2)

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

代码错误

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

更正代码

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

答案 14 :(得分:2)

我能够使用 Chrome 调试程序找到解决方案(我没有安装Firebug或其他第三方工具)

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

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

答案 15 :(得分: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请求中删除数据属性。

答案 16 :(得分:1)

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

答案 17 :(得分:1)

我也遇到了同样的问题。以下是解决问题的两种方法 - 1.如果您正在使用某个框架,请确保您也发送带有ajax调用的CSRF令牌 以下是laravel -

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

在你的js文件中,确保在发送ajax调用之前调用它

$.ajaxSetup({
            headers: {
                'X_CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
            }
        });
  1. 另一种解决方法是将methodpost更改为get

答案 18 :(得分:1)

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

还有另外一种解决这个问题的方法。您应该以这种方式更改JSON数据的最大大小:

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

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

答案 19 :(得分: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";
    }
}

答案 20 :(得分:1)

我遇到了这个问题,因为我调用ajax post的页面有EnableViewState =“false”和EnableViewStateMac =“false”但不是被调用的页面。当我把它放在两个页面中时,一切都开始起作用。当我看到MAC地址异常时,我怀疑这一点。

答案 21 :(得分:1)

在启用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

答案 22 :(得分:1)

当我在jquery'on load'处理程序中执行两个ajax查询时,我发现这发生在chrome中,就像$(function(){$ .ajax()... $ .ajax()...}) ;

我使用以下方法避免使用:

setTimeout(function_to_do_2nd_ajax_request, 1);

它可能是一个chrome和/或jquery bug

答案 23 :(得分:0)

您的返回字符串数据可能很长。

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

例如:

  • 1个字符= 1个字节
  • 5 Char = 5 Byte
  • “Hakki”= 5 Byte

答案 24 :(得分:0)

在服务器端使用Try Catch块,并在catch块中将异常错误传回客户端。这应该会给你一个有用的错误信息。

答案 25 :(得分:0)

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

答案 26 :(得分:0)

您的代码包含dataType: json

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

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

答案 27 :(得分:0)

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

答案 28 :(得分:0)

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

答案 29 :(得分:0)

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

答案 30 :(得分:0)

试试这个 标题:{ 'X-Requested-With': 'XMLHttpRequest' }, 在阿贾克斯中, 在 url 上方设置类型