如何确定由我的 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
更改为 ActionResult
和 return 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 错误?