Многократные обратные копии ASP перекрываются

У меня есть веб-приложение ASP Web Forms, которое используется для поиска в моей базе данных. У меня есть страница, которая содержит gridview, а также поле ввода текста для фильтрации результатов.

Поле ввода имеет событие onkeyup, которое запускает обратную передачу JavaScript для обновления gridview от codebehind.

А также в codebehind у меня есть метод, который выполняет сохранение последнего запроса фильтра, и если запрос не равен предыдущему запросу фильтра, я запускаю новый запрос в базу данных.

Моя проблема - событие 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, но это только задерживает выполнение кода, но не прерывает.

Я думаю, что могу сделать первые результаты кеша и вернуть его. Но мне нужно знать все решения этой проблемы.

Можно ли каким-либо образом выполнить только последнее событие из JavaScript? Но тогда кто-то может отправить несколько запросов, и мое веб-приложение может упасть (DDOS).

javascript,asp.net,webforms,

0

Ответов: 2


0 принят

Вы не можете прервать то, что уже происходит на сервере, но есть проблема с вашим кодом «задержки». Вам необходимо сохранить timeoutпеременную между вызовами.

Пытаться:

<script type="text/javascript">
//New Position for timeout variable
var timeout = null;
function DoUpdateGridView() {     
    //This will now clear the existing timneout function   
    clearTimeout(timeout);
    timeout = setTimeout(function () {
       //For debug purposes only
       console.log("About to postback");
       Sys.WebForms.PageRequestManager.getInstance()._doPostBack('<%=GUIGridUpdatePanel.ClientID%>', '<%=GUIGridUpdatePanel.UniqueID%>');
    }, 1000);

};
</script>

0

Когда два (или более) postbacks сделаны от одного и того же клиента одновременно, они отправляют те же данные ViewState на сервер как часть каждого запроса. Состояние управления является частью ViewState. Предполагая, что сеанс обрабатывается по умолчанию , эти запросы обрабатываются сервером поочередно.

Предположим, что сервер управляет элементами управления при обработке первого запроса. Затем обрабатывается второй запрос. Но так как оба обратной передачи были сгенерированы одновременно, второй запрос имеет тот же вид ViewState (и, таким образом, одно и то же состояние управления) в качестве первого запроса, поэтому состояние элементов управления, которое видит сервер, является состоянием до обработки первого запроса , а не состояние после обработки первого запроса!

Простейшим решением является сохранение частей состояния, которые вы используете, чтобы определить, следует ли изменять элементы управления в сеансе, который по умолчанию хранится в памяти на сервере, тем самым делая два запроса различимыми.

JavaScript, asp.net, WebForms,
Похожие вопросы