对 ASP.NET Web 服务的 jQuery ajax POST 调用随机失败

Posted

技术标签:

【中文标题】对 ASP.NET Web 服务的 jQuery ajax POST 调用随机失败【英文标题】:jQuery ajax POST call to ASP.NET Web Service randomly fails 【发布时间】: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.ajax 和 api.jquery.com/jQuery.param 我在 ajax 调用之前有日志语句以查看正在发送的内容,它会在相同的数据集上随机失败(使用相同数据的多次调用) 即使添加了traditional: true,我也看到它失败了 【参考方案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 并没有太大帮助。调用立即失败,没有做任何事情

以上是关于对 ASP.NET Web 服务的 jQuery ajax POST 调用随机失败的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET - 使用 jQuery 实现基于 JSON 的 Web 服务的正确方法是啥?

使用 JQuery 访问 ASP.net Web 服务时出错 - JSONP

无法从 jQuery 使用 ASP.NET Web 服务

扩展从 JQuery 调用 Web 服务时从 ASP.NET 引发的异常

带有 ASP.NET MVC 的 jquery - 调用启用 ajax 的 Web 服务

Asp.net Webservice - 使用 jquery AJAX 安全调用 Web 服务