2010-02-05 1 views
3

У меня есть веб-сервис WCF, который использует состояние сеанса ASP.NET. WCF устанавливает блокировку чтения и записи для сеанса для каждого запроса. Это означает, что мой веб-сервис может обрабатывать только один запрос за раз для пользователя, что ухудшает воспринимаемую производительность нашего приложения AJAX.Как установить тайм-аут LOCK для чтения и записи в ASP.NET SessionState?

Так что я пытаюсь найти способ обойти это ограничение.

  • Использование блокировки только для чтения (которая допускает одновременный доступ к сеансу) не поддерживается WCF.
  • Я не нашел способ освободить блокировку чтения и записи вручную во время обработки запроса
  • Итак, теперь я думаю, что может быть какой-то способ установить тайм-аут блокировки чтения и записи на очень короткий интервал, чтобы ожидания ожидания не требовали очень долгого ожидания. См. Нижнюю часть, выделенную полужирным шрифтом.

Из MSDN: http://msdn.microsoft.com/en-us/library/ms178581.aspx

«Если две параллельные запросы сделаны одной и той же сессии первый запрос получает эксклюзивный доступ к информации о сеансе Второй запрос выполняется только после того, как первый запрос закончен.. (Второй сеанс также может получить доступ, если исключительная блокировка информации освобождается, потому что первый запрос превышает тайм-аут блокировки.) Если значение EnableSessionState в директиве @ Страницы установлено в ReadOnly, запрос на чтение - только информация сеанса не приводит к исключительной блокировке данных сеанса ».

... Но я не нашел никакой информации о том, как долго этот тайм-аут блокировки, или как его изменить.

+1

Вам нужно полное состояние сеанса? Не можете ли вы извлечь то, что вам нужно, и пройти в DTO? –

+0

Мне не нужно все состояние сеанса, только некоторые из данных там. Я не уверен, как это относится к проблеме блокировки. –

+0

Я нашел эти различные свойства, которые могут быть связаны и соответствующие: HttpContext.Current.Session.IsReadOnly = ложной HttpContext.Current.ReadonlySessionState = ложной System.Web.SessionState.SessionStateModule.s_configExecutionTimeout = 110 секунд системы. Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_DELTA = 0,25 секунды System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500 (миллисекунды?) System.Web.SessionState.SessionStateModule.s_lock = System.Web.Util.ReadWriteSpinLock . –

ответ

0

Кто-нибудь пытался использовать SQLSessionStateProvider и модифицировал SP? Я сделал это в dev и, похоже, обошел проблемы с блокировкой, но не уверен, есть ли у него какие-либо побочные эффекты. В основном то, что я сделал, это изменение 3 SP, которые получают эксклюзивные блокировки, так что столбец Lock всегда равен 0.

+0

Это был не совсем тот ответ, который я искал, но это поможет решить эту проблему. Так что спасибо и ответ принят (довольно запоздало). –

1

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

По умолчанию это значение составляет 110 секунд после 2.0 asp, а до этого - 90 секунд. Меня беспокоит изменение этого поведения в будущем и «фиксированное».