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

How can I determine the cause of the Internal Server Error resulting from my Ajax call?

在我的 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);
    }
});

...调用此控制器方法:

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,状态文本为“内部服务器错误

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

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

...但我不明白这对我有什么帮助。将 ajax 调用按其步调进行,在浏览器中不会显示任何内容;使用 Chrome DevTools,我可以进入它,但是一旦我进入“调试器”行,它对我没有任何帮助。即使是该行的 F11 也什么都不做。

那么我怎样才能查明导致此 500/内部服务器错误的原因?

更新

因为我已经注释掉了 jQuery AJAX 调用 var model = JSON.stringify({})contentType: 'application/json' 中的“JSON”行,我是否也应该更改控制器return 输入从 JsonResultActionResultreturn 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

contentType: "application/json; charset=utf-8",
dataType: "json",

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

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

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

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

由于它是一个 GET 操作方法,如果您要返回 json 数据,您应该明确指定 JsonRequestBehaviour.AllowGet.

这应该可以解决问题。

return Json(model,JsonRequestBehavior.AllowGet);

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

对此有更详细的解释。