Если посетитель запускает выполнение длинной операции, то сайт перестает ему отвечать, пока не отработает.
Как я понял затык происходит при восстановлении сессии, так как если сессия пустая, то проблемы не возникает.
С этим поведением как-нибудь можно бороться?
Re: Блокируется сессия при выполнении длинной операции
Здравствуйте, Дюша, Вы писали:
Д>Здравствуйте, bubuka115, Вы писали:
B>>длинной операции Д>Насколько длинной?
Не имеет значения, пусть будет минута
B>>при восстановлении сессии Д>???
При подключении объекта Session
B>>если сессия пустая Д>Это как?
Это так, что в коллекции Session ничего нет.
Re: Блокируется сессия при выполнении длинной операции
Здравствуйте, bubuka115, Вы писали:
B>Если посетитель запускает выполнение длинной операции, то сайт перестает ему отвечать, пока не отработает. B>Как я понял затык происходит при восстановлении сессии, так как если сессия пустая, то проблемы не возникает. B>С этим поведением как-нибудь можно бороться?
<%@ Page ... EnableSessionState="false"%>
или
<%@ Page ... EnableSessionState="ReadOnly"%>
Понимать только к чему это приводит...
Re[2]: Блокируется сессия при выполнении длинной операции
Access to ASP.NET session state is exclusive per session, which means that if two different users make concurrent requests, access to each separate session is granted concurrently. However, if two concurrent requests are made for the same session (that is, using the same SessionID value), then the first request received gains exclusive access to the session information and the second request will execute once the first request completes, or until the exclusive lock on the information is freed due to the first request exceeding the lock timeout. If the EnableSessionState page directive is set to ReadOnly, then a request for the read-only session information does not result in an exclusive lock on the session data. Read-only requests for session data may still have to wait for a lock gained by a read-write request for session data to clear.
Доступ к состоянию сессии может быть в двух режимах: эксклюзивным (для записи) и только для чтения. Выбор режима осуществляется на уровне страницы в директиве Page атрибут EnableSessionState. Одновременно только один запрос может получить доступ к состоянию сессии в эксклюзивном режиме. Одновременный доступ нескольких запросов к сессии может быть осуществлен если все они проходят в режиме ReadOnly.
Re[2]: Блокируется сессия при выполнении длинной операции
Здравствуйте, Koxa, Вы писали:
K><%@ Page ... EnableSessionState="false"%> K>или K><%@ Page ... EnableSessionState="ReadOnly"%>
K>Понимать только к чему это приводит...
Похоже плохо объяснил проблему.
Скажем посетитель запускает поиск, но наше замечательное приложение не отвечает достаточно быстро. Тогда этот несчастный решает поменять параметры поиска.. А вот и фиг говорим ему мы, пока поиск не выполнен ни куда ты не пойдешь.
Т.е. мы не можем отказаться от сессии. Просто хочется где-нибудь (например в BeginRequest) убивать задумчивый запрос.
Итак, довольно грубое решение.
Запускаем выполнение "тяжелого" метода в новом потоке, добавляем в Application ссылку на поток и подключаемся к нему (Join).
При новом запросе убиваем этот поток.
Первый запрос должен проверить отработал ли метод нормально, или был убит. Если убили, то Response.Close(), или какое-нибудь сообщение пользователю.