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

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

所以我注释掉了这两行并在“调试器”中添加了它们(由nurdyguy在这里提到[ 为什么我的AJAXoned Action的返回不被调用者视为成功?] :

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

……但是我看不出是什么让我感到震惊。 通过它的步调放置ajax调用只是在浏览器中没有显示任何内容; 使用Chrome DevTools,我可以进入它,但是一旦我进入“调试器”行,它对我没有任何好处。 即使是那条线上的F11也什么也没做。

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

UPDATE

由于我已经从jquery AJAX调用(“var model = JSON.stringify({})”和“contentType:’application / json’”)中注释掉了“json”行,我是否还应该从JsonResult更改Controller返回类型到ActionResult和“返回视图(模型)”?

更新2

我现在用我的AJAX方法获得了“成功”,结合了几个建议,并将模型从DataTable成员更改为通用的字符串列表:

 // Model (C#) public class UnitReportPairModel { public List 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 emailAddresses = UnitReportPairEmailValsDT .AsEnumerable() .Select(row => row.Field("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

一旦我拼凑了几个不同的答案和相关的问题,我在这里写了一个关于如何做到这一点的小贴士。

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

这应该解决它。

 return Json(model,JsonRequestBehavior.AllowGet); 

如果你的动作方法用[HttpPost]修饰并且你正在进行POST调用,你不需要显式指定它, return Json(model)将正常工作。

以下是对此相关的更详细说明。

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

还要检查chrome dev工具的网络选项卡,检查您的请求是否生成了包含数据的有效GET URL以及调查响应输出。 – 希望帮助

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

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

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