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

Вид: 29669|Ответ: 3

[ASP.NET] ASP.NET нескольких запросов на странице одновременно возникает ситуация блокировки приостановленной анимации

[Скопировать ссылку]
Опубликовано 22.09.2017 17:32:59 | | | |
Недавно, когда я работал над проектом, на некоторые страницы нужно было загрузить много данных, и иногда я кликал на страницу, не дождавшись загрузки страницы, а потом снова кликал на другую страницу

Во время загрузки сайта будет очень медленное состояние приостановленной анимации, так что давайте сегодня внимательно изучим это.

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

Давайте сегодня рассмотрим всё подробнее!! Первым тестировался код:

Код 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 означает, что запрашиваемая вами сессия является неэксклюзивной блокировкой (то есть ваш запрос всё равно должен ждать завершения, запрос на эксклюзивную блокировку, но вы можете обработать запрос с параллельным неэксклюзивным блокировкой). Но важно убедиться, что ваш код не записывает сессии. Это не обязательно должно выполняться фреймворком)





Предыдущий:CEF: Встраивайте Chrome для клиента
Следующий:Ошибка HTTP 503. Услуга недоступна.
Опубликовано 06.07.2018 11:53:31 |
Для WebForms добавьте после страницы в верхней части aspx (просто загрузите эту страницу блокировки):

EnableSessionState="Только для чтения"
 Хозяин| Опубликовано 14.07.2019 20:34:17 |
Большинство веб-разработчиков используют сессии для сохранения состояний сессий, но использование сессий в asp.net приложениях может существенно повлиять на производительность веб-приложений. Почему и что это может повлиять — ниже анализируется

Объяснение MSDN для одновременных запросов и сессий гласит:

Параллельные запросы и статус сессии
Доступ к состоянию ASP.NET сессии осуществляется за сессию, то есть если два разных пользователя отправляют запрос одновременно, доступ к каждой отдельной сессии предоставляется одновременно. Однако если два одновременных запроса относятся к одной и той же сессии (используя одно и то же значение SessionID), первый запрос получит эксклюзивный доступ к информации сессии. Второй запрос будет выполнен только после завершения первого запроса. (Если эксклюзивная блокировка на информацию о сессии освобождается из-за превышения тайм-аута первой сессии, вторая сессия также получает доступ.) Если вы установите значение EnableSessionState в директиве @Page как ReadOnly, запросы информации о сессии только для чтения не приводят к эксклюзивной блокировке данных сессии. Однако запросы только для чтения на данные сессии могут потребовать разблокировки блокировки от запроса чтения/записи, установленного сессионными данными.
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com