如何确定由我的 Ajax 调用导致的内部服务器错误的原因?

Posted

技术标签:

【中文标题】如何确定由我的 Ajax 调用导致的内部服务器错误的原因?【英文标题】:How can I determine the cause of the Internal Server Error resulting from my Ajax call? 【发布时间】:2016-08-15 09:27:10 【问题描述】:

在我的 ASP.NET MVC 应用程序中,使用此 AJAX 调用:

$.ajax(
    type: 'GET',
    url: '@Url.Action("GetUnitReportPairVals", "Home")',
    data:  unit: unitval, report: rptval , // data: model,
    contentType: 'application/json',
    cache: false,
    success: function (result) 
        alert(result);
    ,
    error: function (result) 
        alert('failed');
        alert(result);
    
);

...调用此 Controller 方法:

public JsonResult GetUnitReportPairVals(string unit, string report)

    int rptId = GetReportIDForName(report);

    DataTable UnitReportPairEmailValsDT = new DataTable();
    string qry = string.Format(SQL.UnitReportPairEmailQuery, unit, rptId);
    UnitReportPairEmailValsDT = SQL.ExecuteSQLReturnDataTable(
        qry, 
        CommandType.Text,
        null
        );

    var model = UnitReportPairEmailValsDT;
    return Json(model);

我看到“失败”警报,“结果”对象没有数据结束;这只是冰山一角:

似乎关键是状态为 500,状态文本为“Internal Server Error

所以我注释掉了这两行并添加了“调试器”来代替它们(正如 nurdyguy here 所建议的那样):

$.ajax(
    . . .
    error: function (result) 
        debugger;
        //alert('failed');
        //alert(result);
    
);

...但我不明白这能带给我什么。将 ajax 调用按部就班地在浏览器中显示任何内容。使用 Chrome DevTools,我可以进入它,但是一旦我进入“调试器”行,它对我没有任何帮助。甚至该行的 F11 也无济于事。

那么我怎样才能找到导致这个 500/Internal Server Error 的原因呢?

更新

既然我已经注释掉了 jQuery AJAX 调用 var model = JSON.stringify()contentType: 'application/json' 中的“JSON”行,我是否也应该将 Controller 返回类型从 JsonResult 更改为 ActionResultreturn View(model)

更新 2

我现在从我的 AJAX 方法中得到了一个success,它结合了你们的一些建议,并将模型从一个 DataTable 成员更改为一个通用的字符串列表:

// Model (C#)
public class UnitReportPairModel

    public List<String> UnitReportPairEmailVals  get; set; 
    . . .
   

// Controller (C#)
public JsonResult GetUnitReportPairEmailAddresses(string unit, string report)

    UnitReportPairModel model = new UnitReportPairModel();
    try
    
        int rptId = GetReportIDForName(report);

        DataTable UnitReportPairEmailValsDT = new DataTable();
        string qry = string.Format(SQL.UnitReportPairEmailQuery, unit, rptId);
        UnitReportPairEmailValsDT = SQL.ExecuteSQLReturnDataTable(
            qry,
            CommandType.Text,
            null
            );

        List<String> emailAddresses = UnitReportPairEmailValsDT
                     .AsEnumerable()
                     .Select(row => row.Field<string>("EmailAddr"))
                     .ToList();

        model.UnitReportPairEmailVals = emailAddresses;
    
    catch (Exception ex)
    
        Console.WriteLine(ex.Message);
    
    return Json(model, JsonRequestBehavior.AllowGet);


// View (jquery)
var model = JSON.stringify( unit: unitval, report: rptval );
    $.ajax(
        type: 'GET',
            url: '@Url.Action("GetUnitReportPairEmailAddresses", 
    "UnitReportPair")',
            data:  unit: unitval, report: rptval , // data: model,
            contentType: 'application/json',
            cache: false,
            success: function (result) 
                alert('success');
                alert(result.data);
            ,
            error: function () 
                alert('failure');
            
        );

更新 2

当我把这个问题和相关问题的几个不同答案拼凑在一起后,我写了一个关于如何做到这一点的提示here。

【问题讨论】:

使用您的浏览器工具(网络选项卡)检查对呼叫的响应。它将为您提供错误的详细信息。 在控制器操作中添加断点,点击播放,触发 ajax 请求并逐步执行操作。 注意:请求中显示的 responseText 可能是 html,这可能意味着传回给您的 AJAX 调用是您应用程序中错误页面的 HTML。正如@LarsAnundskås 指出的那样,您确实需要在服务器上捕获此错误(在调试时)才能深入了解它。 【参考方案1】:

由于是 GET 动作方法,如果返回 json 数据,应显式指定JsonRequestBehaviour.AllowGet

这应该可以解决它。

return Json(model,JsonRequestBehavior.AllowGet);

如果您的操作方法用[HttpPost] 装饰,并且您正在进行POST 调用,则无需显式指定它,return Json(model) 可以正常工作。

Here 是一个更详细的解释。

【讨论】:

我不得不将“行为”更改为“行为”(美式拼写)。我尝试了类似的方法,但没有成功(“return Json(new Result = model , JsonRequestBehavior.AllowGet);”),但我会试试这个...... 谢谢!我也修正了答案中的错字]l。【参考方案2】:
contentType: "application/json; charset=utf-8",
dataType: "json",

还要检查 chrome 开发工具的网络选项卡,检查您的请求是否使用您的数据生成有效的 GET URL,并调查响应输出。 -- 希望有帮助

【讨论】:

它也浮动,所以他们说。【参考方案3】:

您的浏览器可以帮助您调试发送和接收的消息。我认为在所有浏览器(不包括 Safari)中都是 F12,并且应该有一个用于捕获并显示所有流量的网络选项卡。

带有适当调试设置的 IDE 可以引导您完成代码并捕获大多数服务器错误(Visual Studios 有一个内置调试器,xdebug 可用于 php)。

最后,您可以下载 Fiddler http://www.telerik.com/fiddler 之类的东西,它会在 Web 级别为您提供更多详细信息,类似于浏览器调试工具。这对于评估通过 AJAX 调用发送和接收的数据非常有用。

【讨论】:

使用 HttpFilter 处理您的 HttpRequest,如果它发现任何错误,则将其返回给您的 ajax 方法或任何视图。研究一些这个话题不要问我

以上是关于如何确定由我的 Ajax 调用导致的内部服务器错误的原因?的主要内容,如果未能解决你的问题,请参考以下文章

为啥从 ajax 调用 web 服务会引发内部服务器 500 错误?

Ajax 导致 500 内部服务器错误

如何抑制由我​​无法更改的代码显示的对话框?

如何避免由于太多ajax调用而导致浏览器内存不足错误

POST 500(内部服务器错误) - Ajax 和 laravel 4

使用 jquery ajax jsonp 调用 web 服务:错误