Недавно, когда я работал над проектом, на некоторые страницы нужно было загрузить много данных, и иногда я кликал на страницу, не дождавшись загрузки страницы, а потом снова кликал на другую страницу
Во время загрузки сайта будет очень медленное состояние приостановленной анимации, так что давайте сегодня внимательно изучим это.
Сначала я думал, что такая ситуация возникает на большинстве сайтов или на моей проблеме с сетью компьютера, но обнаружил, что на этом сайте такой ситуации нет, иногда я застревал при публикации, но кликал на другие страницы во вкладке, чтобы быстро загрузиться.
Давайте сегодня рассмотрим всё подробнее!! Первым тестировался код:
Код Homeview:
Код контроллера:
Для анализа тестового кода у нашего контроллера есть 3 метода: один — главная страница, а два других — методы тестирования
Запрос Test1 блокируется на 5 секунд, а затем возвращает данные пользователю
Запросы Test2 не блокируют и возвращают данные напрямую пользователю
Наша главная страница состоит из двух интерфейсов для запросов Ajax, которые являются асинхронными, так что проблем с блокировкой нет.
Мы обнаружим, что метод Test1 выводит содержимое только после того, как Test2 выводит содержимое (Обычно страница выводит содержимое Test2 напрямую, а затем ждёт 5 секунд, чтобы вывести содержимое, возвращаемое Test1, потому что js не блокирует)
Затем мы напрямую получаем доступ к интерфейсам Test1 и Test2, сначала получаем доступ к Test1, а затем сразу к Test2, и обнаруживаем, что Test2 должен дождаться возвращения Test1, чтобы завершить, как показано на рисунке ниже:
Если запрос на страницу устанавливает блокировку читателя, другие запросы, обрабатываемые одновременно в той же сессии, не смогут обновить состояние сессии, но, по крайней мере, их можно прочитать. Если страница запрашивает блокировку записи для состояния сессии, то все остальные страницы блокируются, независимо от того, хотят ли они читать или писать контент. Например, если два вида программ пишут контент в одной сессии одновременно, одна программа должна дождаться завершения другой программы, прежде чем её можно будет написать. В программировании AJAX важно учитывать это происходящее.
Особое примечание: только при написании сессии Asp.net блокирует запрос, но если вы посетили страницу, где записана сессия, например, операцию после входа в систему вместе с сессией (сессия заблокирована до истечения срока, конечно, только если SessionID остаётся тем же). Будет такая проблема.
Информация на netizen
Пока сайт использует сессию, каждый запрос будет блокировать сессию на протяжении всей её жизни, поэтому запросы с тем же sessionid должны ждать разблокировки
Это значит, что если на сайте есть страница с ограниченным тайм-аутом, он ничего не может сделать, и вам приходится ждать загрузки страницы с ограниченным временем.
Ты тоже не можешь сделать это — несколько одновременно запросов ajax на одной странице, ты не можешь это сделать, запросы на опрос сообщений.
В итоге:Если вы проведёте сессию по запросу, если не принесёте сессию по запросу, вышеописанная ситуация не произойдёт
Решение:
Добавлена функция SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly) в контроллер контроллера
Заметка:
Обязательное означает, что вы запрашиваете эксклюзивную блокировку на сессию (то есть отсутствие параллельной обработки запросов для одного и того же идентификатора сессии) ReadOnly означает, что вы запрашиваете неэксклюзивную блокировку на Session (то есть ваш запрос всё равно должен ждать завершения запросов с эксклюзивной блокировкой, но вы можете обрабатывать запросы с неэксклюзивным блокировкой Замки параллельно. Однако именно вам решать, чтобы ваш код не записывался в Session. Фреймворк не обязательно контролирует её) Требуется — это сессия, который вы запрашивали (то есть нет необходимости параллельной обработки одного и того же SessionID)
ReadOnly означает, что запрашиваемая вами сессия является неэксклюзивной блокировкой (то есть ваш запрос всё равно должен ждать завершения, запрос на эксклюзивную блокировку, но вы можете обработать запрос с параллельным неэксклюзивным блокировкой). Но важно убедиться, что ваш код не записывает сессии. Это не обязательно должно выполняться фреймворком)
|