Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 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) до контролера контролера

Примітка:

Обов'язковий означає, що ви запитуєте ексклюзивне блокування на Session (тобто відсутність паралельної обробки запитів на той самий session ID)
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