【发布时间】:2012-04-26 14:48:55
【问题描述】:
在 Javascript 方面,我为 onkeyup 事件的文本 <input> 注册了一个事件侦听器。
每次触发事件时,都会调用一个函数,该函数会创建一个 xmlhttprequest 对象,该对象将输入的 value 作为 url 编码的 POST 变量传递给请求。
请求页面是一个aspx 脚本,它接受post 变量,对其进行一些处理,并将处理后的输入作为参数添加到MS SQL 查询中。执行查询产生的结果集被放入dataset 中,该dataset 被转换为 XML,然后通过 XSLT 转换为 XHTML,然后通过innerHTML 注入方法插入到进行 ajax 调用的页面中。
到目前为止,如果您一直关注我,结果是在 MS SQL 数据库上进行全文搜索,该数据库会为每个密钥版本生成结果。值得一提的是,我使用的是 MS SQL 2005 和 IIS6.0。
系统似乎运行良好,除了一个测试用例。也就是说,当有人尽可能快地输入输入时,服务器最终会为每个请求返回501 internal server errors。几分钟后,它似乎会自行“修复”并再次正常运行。我无法从 IIS 中获得有关这些内部错误的任何有用信息。
现在这只是猜测,但我的第一个假设是有太多未完成的同时打开的请求,或者在短时间内发出的请求太多。
我最初的想法是为这些xmlhttprequests 创建一个队列,并且一次只打开一个。
但是,我尝试了这个而不是队列:
每个onkeyup:
- 在
onkeyup生成的最后一个xmlhttprequest上调用abort - 为此
onkeyup创建一个新的xmlhttprequest
这个过程似乎可以解决这个问题。
我无法确定此问题的根本原因:这是服务器限制吗?还是浏览器限制?是否有其他方法可以在不需要此中止程序的情况下解决此问题?
如有必要,我可以发布代码,但代码非常冗长,并且该项目中使用了许多技术,所以我不确定它是否真的能帮助任何人回答这个问题。
【问题讨论】:
-
让 ajax 调用 onkeyup 可能不是一个好主意。这很可能是浏览器的限制,我记得读过一些大多数浏览器只允许同时进行 7 或 8 个异步操作的内容。
-
浏览器不会出现 501 错误。归根结底是服务器限制,因为服务器控制着 http 响应代码。
-
不过,我认为这并不牵强。例如,以一个很多人都熟悉的非常常见的网站为例:www.google.com;我的项目绝不会接近谷歌的范围,但是如果您在控制台中注意到搜索输入中的每个按键都会发出 GET 请求。大概是因为他们的自动完成功能。
-
是的,您的服务器可能超载。您可以在 keyup 上设置超时,或者在每次 keyup 时取消绑定您的处理程序,然后在成功时重新绑定它。
-
我正在调查 IIS6.0 的限制,我似乎找不到规格。我的意思是即使我发出 30 个请求,据说 IIS 可以同时处理数千个连接,所以我认为它不应该超载?除非是出于安全考虑。
标签: javascript asp.net ajax xmlhttprequest onkeyup