【问题标题】:jQuery ajax POST call to ASP.NET Web Service randomly fails对 ASP.NET Web 服务的 jQuery ajax POST 调用随机失败
【发布时间】:2012-08-11 02:29:42
【问题描述】:

我正在为移动设备开发一个网站,该网站使用 jQuery (v 1.7.2) 对 ASP.NET (v 2.0.50727) Web 服务进行 ajax 调用。

调用在大约 95% 的时间里正常工作,但它会随机失败,返回 500 内部服务器错误。它在第一行代码执行之前在服务器端失败(第一行写入事件日志)。

我还没有看到使用我记得的桌面浏览器调用失败,但我已经看到使用 iPad 失败了。我加了

<browserCaps userAgentCacheKeyLength="256">

到 Web 服务的 web.config 文件,但这没有帮助。

javascript:

$.ajax({
  type: "POST",
  url: serverURL + "/getImage",
  data: '{"formURL":"' + url + '", "rowNumber":"'+rowNumber+'"}',
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: function (msg,textStatus, jqXHR) {
    ...
  }, error: function(xhr, ajaxOptions, thrownError) {
    ...
  }
}).done(function(){
  console.log("getImage call is done");
});

传递给 Web 服务的示例数据:

'{"formURL":"fileName.xml", "rowNumber":"1"}'

c#

[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string getImage(string formURL, string rowNumber) {
  log("Retrieving image of form " + formURL);
  string image = "";
  string username = /*retrieve username*/;
  string password = /*retrieve password*/;
  if (username != null && username != "") {
    image = /*code to retrieve the image*/;
  }
  return image;
}

private void log(string message) {
  EvLog.WriteToEventLog(DateTime.Now.ToString("MM:dd:yyyy H:mm:ss:fff") + Environment.NewLine + message, 10);
}

我发现唯一对我有一点帮助的事情是,当调用失败时,因为来自 Web 服务的响应标头包含“jsonerror: true”,尽管我无法确定它为什么会随机失败。

感谢任何帮助!

【问题讨论】:

  • 会不会是当它无法向上发送数据时,它以某种方式包含无效的 JSON?也许文件名或行号中有一些无效字符?将数据添加到变量中,即:var data = '{"formURL":"' + url + '", "rowNumber":"'+rowNumber+'"}' 然后在 ajax 调用之前添加一个console.log(data),这应该会在浏览器调试工具的 conole 输出窗口中显示您将要发送的数据。 Debuggin 工具内置于 Chrome 和 IE(我认为是 F12 热键),对于 FF,您需要安装 FireBug 插件。
  • 除了下面的答案之外,您还可以尝试在 ajax 调用 traditional: true 中弄乱另一个设置。我们发现它适用于发布 JSON,但我们使用的是 ASP.NET MVC3,但仍然值得一试。 traditional: true 将导致“浅”序列化。有关详细信息,请参见此处:api.jquery.com/jQuery.ajaxapi.jquery.com/jQuery.param
  • 我在 ajax 调用之前有日志语句以查看正在发送的内容,它会在相同的数据集上随机失败(使用相同数据的多次调用)
  • 即使添加了traditional: true,我也看到它失败了

标签: c# jquery ajax web-services ipad


【解决方案1】:

假设它确实是一个JSON错误,我的第一个想法是传递给参数的数据不正确。

以下行引用了变量的内容,我假设它是从代码中的其他地方加载的:

data: '{"formURL":"' + url + '", "rowNumber":"'+rowNumber+'"}',

假设您已经确定 rowNumber 是一个整数值并且不会破坏它,则可能是“url”变量破坏了您的 JSON 格式。发生这种情况的最简单方法是,如果您在文件名中有一个未转义的引号,特别是如果它在连接时比预期更早地关闭您的参数值。

字符总是有可能对字符集无效。您是否有触发失败的示例数据?提供的示例看起来很干净,所以我假设它不是错误案例之一。

【讨论】:

  • 服务器端的两个参数都是字符串,但转义字符听起来很明确,可能会弄乱绑定。
  • 奇怪的是,使用相同数据的调用将工作大约 9/10 次,然后失败一次,然后再次开始工作。但是提交数据的一个例子是{"formXML":"20120807114859.xml", "rowNumber":"5"}
  • 如果您的服务器抛出内部服务器错误 500,请检查错误日志以了解原因。
  • 我试过查看日志,不能说我找到了错误日志,但我看到的日志只告诉我我知道的——调用返回状态码 500跨度>
【解决方案2】:

不要以这种方式构建数据

data: '{"formURL":"' + url + '", "rowNumber":"'+rowNumber+'"}',

可能会导致 JSON 字符串格式错误。

使用 JSON.stringify 方法代替这个字符串化你的 JavaScript 对象:

data: JSON.stringify({formUrl: url, rowNumber: rowNumber}),

JSON.stringify 将为您完成所有工作,将您的对象表示为有效的 JSON 字符串。

【讨论】:

  • 现在测试它是否已修复
  • 无论如何,将您的服务器代码放入 try-catch 块中,并在未捕获的错误上写入日志以了解发生了什么(确定您是否还没有这样的机制)。
  • 即使更改为 JSON.stringify,它仍然随机失败。更改后的第一次尝试失败,但之后的调用有效。
  • 1.在客户端添加 AJAX 错误处理程序$.ajax(/*...*/).error(function(data){/* */}); 2. 确保您正在处理未捕获的服务器端错误并存储有关它们的信息,正如我已经提到的。显然,您需要执行这些步骤才能正确调试流程。
  • 我在客户端确实有错误处理。我已经在服务器端添加了一个 try-catch,但是服务器端方法中的第一行代码甚至从未被调用过……所以 try catch 并没有太大帮助。调用立即失败,没有做任何事情
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多