如何确定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调用发送和接收的数据非常有用。