javascript - ASP 多个回发重叠
问题描述
我有 ASP Web Forms Web 应用程序,用于在我的数据库中进行搜索。我有一个页面,其中包含 gridview 以及用于过滤结果的文本输入字段。
输入字段具有 onkeyup 事件,该事件通过 JavaScript 运行回发以从代码隐藏中刷新网格视图。
而且在代码隐藏中我有方法,它保存状态最后一个过滤器请求,如果请求不等于以前的过滤器请求,那么我对数据库运行新查询。
我的问题 - 文本输入字段上的 onkeyup 事件可能会生成多个回发。如果它首先回发,那么服务器将执行对数据库的查询。但是以下回发不会执行并与第一个结果重叠。因此我的 gridview 保持旧状态。
<script type="text/javascript">
function DoUpdateGridView() {
var timeout = null;
clearTimeout(timeout);
timeout = setTimeout(function () {
Sys.WebForms.PageRequestManager.getInstance()._doPostBack('<%=GUIGridUpdatePanel.ClientID%>', '<%=GUIGridUpdatePanel.UniqueID%>');
}, 1000);
};
</script>
您可能会看到我为执行 JavaScript 设置了延迟,但这只会延迟代码的执行,但不会中断。
我想我可以先缓存结果,然后返回。但我需要知道这个问题的所有解决方案。
Сan 有什么方法可以只执行来自 JavaScript 的最新事件?但是随后有人可能会发送多个请求,而我的 Web 应用程序可能会失败(DDOS)。
解决方案
当同一客户端同时进行两个(或更多)回发时,它们会将相同的 ViewState 数据作为每个请求的一部分发送到服务器。控件状态是 ViewState 的一部分。假设 Session以默认方式处理,这些请求由服务器串行处理。
假设服务器在处理第一个请求时更改了控件。然后处理第二个请求。但是由于两个回发是同时生成的,所以第二个请求和第一个请求具有相同的 ViewState(因此也具有相同的控件状态),所以服务器看到的控件状态是第一个请求处理之前的状态,而不是处理第一个请求后的状态!
最简单的解决方案是存储您使用的状态片段,以确定是否更改 Session 中的控件,默认情况下存储在服务器的内存中,从而使两个请求可区分。
推荐阅读
- python - 我正在尝试将 mysql 与 django 一起使用,但在使用 pip 安装 mysqlclient 时遇到问题
- scala - 使用 Metals 自动格式化 VSCode 中的代码
- java - 使用模式注册表对 avro 记录进行动态解码
- html - :after 元素的 CSS 选择器,如果 body 有类
- numpy - ImportError:DLL 加载失败:找不到指定的过程。在 python 中使用 sklearn
- bash - 删除除最近 10 个版本之外的所有文件夹
- javascript - 在 React Native 中使用 setState 存储 JSON 数据
- python - 散景:在嵌套分类图中添加一条线
- ios - Swift:写入 JSON 并在本地保存到 iPhone 文件
- html - 内联显示时相对定位的元素会消失吗?