繁体   English   中英

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

[英]JQuery Ajax Post results in 500 Internal Server Error

我正在尝试执行此 AJAX 帖子,但由于某种原因,我收到服务器 500 错误。 我可以看到它在 controller 中达到断点。 所以问题似乎出在回调上。 任何人?

$.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 请求简单代码

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

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

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

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

您需要调试您的服务器。

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

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

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

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

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

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

如果您正在调用的函数以公共共享函数而不是网络服务中的公共函数开头,则您也可以在 VB 中得到该错误。 (如果从类中移动或复制函数可能会发生这种情况)。 只是另一件事要注意。

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

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

你能张贴你应该接受这篇文章的方法的签名吗?

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

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

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

错误的代码

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

正确的代码

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

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

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

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

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

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

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

即像$(function() { $.ajax() ... $.ajax() ... });

我避免使用它:

setTimeout(function_to_do_2nd_ajax_request, 1);

这大概是一个 chrome 和/或 jquery 错误

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

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

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

您传递给服务器的 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# 方法应该是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格式已损坏。

这个问题还有其他办法。 您应该以这种方式更改 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是将methodpost更改为get

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

您的代码包含 dataType: json

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

服务器应改为返回null{}响应。

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

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

例如:

  • 1 个字符 = 1 个字节
  • 5 个字符 = 5 个字节
  • "Hakki" = 5 字节

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

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

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

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

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

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

在我的情况下,错误与实体框架的工作方式有关。 我的数据库中的两个表之间存在一对多关系,当我使用 ajax post 从具有外键的表中获取数据时,它也会获取相关的外键表数据,因为默认情况下启用了延迟加载。 正因为如此,Json return 对数据格式感到困惑,并抛出了这个错误。 所以我不得不使用_wfocEntities.Configuration.LazyLoadingEnabled = false; 在我的 linq 查询之前的这一行,它解决了我的问题。

就我而言,我正在尝试对数据表进行服务器端处理。 我的操作方法返回数千个用户记录为 JSON。 问题是JSON 最大长度 这解决了我的问题。

return new JsonResult()
        {
            ContentEncoding = Encoding.Default,
            ContentType = "application/json",
            Data = returnData,
            JsonRequestBehavior = JsonRequestBehavior.AllowGet,
            MaxJsonLength = int.MaxValue //this is what,I needed.
        };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM