【问题标题】:JQuery Ajax Post results in 500 Internal Server ErrorJQuery Ajax Post 导致 500 内部服务器错误
【发布时间】:2010-11-23 20:41:50
【问题描述】:

我正在尝试执行此 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 有什么关系?
  • “.ajax”前面没有$符号或jQuery前缀是否可以正确调用?
  • 是的。我正在使用 jQuery.noConflicts()。前缀是正确的。就像我说的。它发出请求..但返回错误。
  • 在这里查看帖子developersnote.com/2014/01/…
  • @shamcs 的上述链接末尾包含一个字符串,使其无效。正确的链接是developersnote.com/2014/01/…

标签: javascript jquery ajax


【解决方案1】:

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

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

【讨论】:

  • 您的第一句话具有误导性(暗示客户端发生 500 错误)。在我更彻底地阅读答案之前,我几乎对你投了反对票。你可能想澄清一下。
  • fiddler2.com 对于查看来自服务器的实际响应也非常有用。
  • :Chrome 开发工具实际上缺少的东西!
  • 其实你可以在 Chrome 中调试这个,查看这个答案了解详情stackoverflow.com/a/21786593/14533
【解决方案2】:

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

【讨论】:

  • 几分钟前我刚刚进入了这个问题......你的回答给了我提示:) 其他人可能会很有趣地避免这种情况将这个添加到数据中可以解决问题:= $this- >security->get_csrf_token_name() ?> : '= $this->security->get_csrf_hash() ?>'
  • 谢谢,在 Bonfire 中被困在这个问题上,而且对 CodeIgniter 还不够了解,无法弄清楚。
【解决方案3】:

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

【讨论】:

  • contentType: "application/json; charset=utf-8", 我删除了这一行然后我的问题解决了
  • 如果你仍然使用那条线怎么办? @Taja_100
【解决方案4】:

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

 type:'POST'

【讨论】:

  • 但不是真正的解决方案。有些事情必须是 POST
  • 那是完全错误的。如果将 POST 更改为 GET 确实有效,那么您首先使用了不正确的 HTTPVerb。如果您必须使用 POST,例如您要发送有效负载,则必须使用 POST 并且使用 GET 将不起作用。另一方面,如果您只是得到一些东西并且可以使用 GET,请不要使用 POST,GET 会被缓存(有时取决于配置)
【解决方案5】:

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

【讨论】:

  • 我只是很困惑是否需要在服务器 web.config 或客户端的 web.config 上添加它?另外,请您解释一下这段代码是如何工作的,这真的很有帮助。我正在打印您在此处提到的日志,它表示字符串的长度超过了 maxJson 长度属性的值集。
【解决方案6】:

你可以查看HTTP状态码here(或here),这个错误告诉你:

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

你需要调试你的服务器。

【讨论】:

  • 谢谢,我遇到了这个问题,在操作文件中我无法连接到数据库来存储数据,所以 jQuery post().done() 出现 500 错误。
【解决方案7】:

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

【讨论】:

    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

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

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

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

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

      【讨论】:

      • 对..我最初使用的是 GET 但我得到了同样的错误。
      • 您是否尝试过从浏览器地址栏发出请求?那么你是否也获得了 500 状态?
      【解决方案10】:

      我今天刚遇到这个问题。出现这种错误,你不会得到服务器的任何响应,因此很难定位问题。

      但是我可以告诉你“500 内部服务器错误”是服务器而不是客户端的错误,你在服务器端脚本中遇到了错误。将代码闭包逐个注释掉,再尝试运行,很快就会发现在某处漏掉了一个字符。

      【讨论】:

        【解决方案11】:

        如果您调用的函数在 Web 服务中以 Public Shared Function 而不是 Public Function 开头,您也可能在 VB 中遇到该错误。 (如果您将函数移动或复制出类,可能会发生这种情况)。只是另一件事要注意。

        【讨论】:

          【解决方案12】:

          您可以发布应该接受此帖子的方法的签名吗?

          此外,我收到相同的错误消息,可能是出于不同的原因。我的 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>
          

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

          【讨论】:

            【解决方案13】:

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

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

            【讨论】:

              【解决方案14】:

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

              • 转到开发人员选项卡 (CTRL+MAJ+I)
              • 网络 > 点击失败的请求,红色 > 预览

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

              【讨论】:

                【解决方案15】:

                就我而言,这是一个简单的问题,但很难找到。页面指​​令有错误的继承属性。它只需要包括顶层就可以了。

                代码错误

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

                正确代码

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

                【讨论】:

                  【解决方案16】:

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

                  【讨论】:

                    【解决方案17】:

                    您传递给服务器的 JSON 数据应该与您在客户端形成的名称相同。 例如:

                    var obj = {  Id: $('#CompanyId').val(),
                                 Name: $("#CompanyName").val()
                                };
                    
                    $.Ajax(data: obj,
                    url: "home/InsertCompany".....
                    

                    如果名称不同,例如:

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

                    你会得到这个错误。

                    如果您不传递数据,请从 AJAX 请求中删除数据属性。

                    【讨论】:

                      【解决方案18】:

                      我遇到了这个问题,发现服务器端 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 对象和属性的示例?如果数据:{Prop1:"asdf", Prop2:"zxcv"} 那么如何在公共静态 String ListItem_Selected() 函数中获取 Prop1 和 Prop2 值?谢谢。
                      【解决方案19】:

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

                      这个问题还有其他方法。您应该以这种方式更改 JSON 数据的最大大小:

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

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

                      【讨论】:

                        【解决方案20】:

                        我也遇到了同样的问题。这是我解决它的两种方法- 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

                        【讨论】:

                          【解决方案21】:

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

                          【讨论】:

                            【解决方案22】:

                            您的代码包含数据类型:json

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

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

                            【讨论】:

                              【解决方案23】:

                              当我在 jquery 'on load' 处理程序中执行两个 ajax 查询时,我发现这发生在 chrome 中,

                              即喜欢$(function() { $.ajax() ... $.ajax() ... });

                              我避免使用:

                              setTimeout(function_to_do_2nd_ajax_request, 1);
                              

                              可能是 chrome 和/或 jquery 错误

                              【讨论】:

                                【解决方案24】:

                                我遇到了这个问题,因为我调用 ajax 帖子的页面有 EnableViewState="false"EnableViewStateMac="false",但没有调用页面。

                                当我把它放在两个页面上时,一切都开始工作了。当我看到 MAC 地址异常时,我怀疑这一点。

                                【讨论】:

                                  【解决方案25】:

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

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

                                  例如:

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

                                  【讨论】:

                                    【解决方案26】:

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

                                    【讨论】:

                                      【解决方案27】:

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

                                      【讨论】:

                                      • 这与哪个 Web 服务器有关?可以加点代码吗?
                                      【解决方案28】:

                                      我迟到了,但我遇到了这个问题,我了解到这是我的 PHP 代码上的错误(在我的例子中是选择数据库的语法)。根据我的经验,通常这个错误 500 与使用语法有关。换句话说:“人件”问题! :D

                                      【讨论】:

                                        【解决方案29】:

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

                                        【讨论】:

                                          【解决方案30】:

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

                                          【讨论】:

                                            猜你喜欢
                                            • 1970-01-01
                                            • 2019-12-10
                                            • 1970-01-01
                                            • 2013-08-11
                                            • 1970-01-01
                                            • 2018-10-10
                                            • 2014-09-24
                                            • 1970-01-01
                                            • 1970-01-01
                                            相关资源
                                            最近更新 更多