首页 > 解决方案 > 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)。

标签: javascriptasp.netwebforms

解决方案


当同一客户端同时进行两个(或更多)回发时,它们会将相同的 ViewState 数据作为每个请求的一部分发送到服务器。控件状态是 ViewState 的一部分。假设 Session以默认方式处理,这些请求由服务器串行处理。

假设服务器在处理第一个请求时更改了控件。然后处理第二个请求。但是由于两个回发是同时生成的,所以第二个请求和第一个请求具有相同的 ViewState(因此也具有相同的控件状态),所以服务器看到的控件状态是第一个请求处理之前的状态,而不是处理第一个请求后的状态!

最简单的解决方案是存储您使用的状态片段,以确定是否更改 Session 中的控件,默认情况下存储在服务器的内存中,从而使两个请求可区分。


推荐阅读