稳步减慢从 javascript 对 WCF 服务的 ajax 调用
Posted
技术标签:
【中文标题】稳步减慢从 javascript 对 WCF 服务的 ajax 调用【英文标题】:steadily slowing ajax calls to WCF service from javascript 【发布时间】:2011-03-31 05:02:47 【问题描述】:我有一个使用 jQuery 1.4.2 调用的 WCF 服务(实际上每秒钟左右轮询一次)。随着时间的推移,ajax 调用速度变慢。对方法的初始请求大约为 30 毫秒,但大约半小时后,我可以使用 Opera 的 DragonFly 观看(并且也使用 chrome 的工具进行验证)我的请求时间慢慢增加。在大约半小时内,我从约 30 毫秒的请求时间变为约 300 毫秒的请求时间。
一开始我以为是我写的服务,所以我把方法改成只返回一个值,不计算什么的:
public int DoSomething(int id)
return 0;
我很惊讶地发现行为是相同的:请求时间稳步增加。我知道这很含糊,但是有任何解决此类问题的建议吗?如果不是我的方法,谁是可能的候选人?
我正在使用 .NET 3.5sp1 和 C#
编辑:为了澄清,我使用 jQuery 的 $.ajax 方法进行调用,它的实际请求时间变慢了,响应总是大约 0 毫秒。
编辑 2:我已与 Jon Hanna 一起修复了 cmets 中提到的内存问题,但我的请求时间仍在增长。
【问题讨论】:
听起来您排除了服务方面的问题。你的 jQuery 代码是什么样的?您是否正在获取返回值并将 DOM 元素附加到您的页面、添加新动画、设置计时器等?听起来客户端代码可能是问题所在。 是实际的 ajax 请求变慢了,而不是响应。 您能否发布您的 jQuery ajax 代码以及您如何处理响应?如果您的 ajax 调用中有大量选择器,并且您在成功操作 DOM 时,这可能会减慢发出请求的速度(并解释为什么响应始终为 0 毫秒)。 【参考方案1】:您是否查看过浏览器在运行过程中消耗的内存?可能值得关注这一点,看看它是否会随着时间的推移而增加。
您将需要一个新的浏览器(在您的 YouTube 视频中打开了您最喜欢的音乐家的热门歌曲的不同标签后进行测量没有意义),该浏览器允许爬过任何初始记忆抓取然后运行您的脚本。
如果这是一个问题,那么请考虑合并您的 javascript 对象,尤其是 XHR 本身,以确保事件不会绑定到处理程序然后被忽略,并且您不会不断地添加到主机的 DOM文件。
【讨论】:
浏览器内存在增加,但我不知道它是否重要。约 35-40 分钟约 3.5MB。 jQuery 是使用其 $.ajax 方法控制实际 ajax 请求的一种。【参考方案2】:WCF 的本质是它比任何其他方法都慢。 你试试.ashx吗
它类似于普通的 aspx 页面,但 ashx 没有 html 页面。只是纯粹的代码。非常适合使用查询字符串执行 url 并以字符串或 json 形式返回。
前 http://localhost/test.ashx?get=test
在 ashx 中 返回“通过”;
我通常将它与 jQuery.load('test.ashx?get=test', function(...)) 一起使用这种方法,我不必再担心 $.ajax 废话了
【讨论】:
以上是关于稳步减慢从 javascript 对 WCF 服务的 ajax 调用的主要内容,如果未能解决你的问题,请参考以下文章
从服务内的 JavaScript HTML 调用 WCF 服务
经过身份验证的服务不支持跨域 javascript 回调。通过 SSL 代理对 WCF 服务的 AJAX 查询
从 JavaScript 访问 WCF WebService - 对预检请求的响应未通过访问控制检查