У меня было это SemaphoreFullException в течение некоторого времени.
Подводя итог. Я разместил приложение на IIS 7.5 с помощью ASP.NET v4.0 framework Application Pool (интегрированный). Я использую проверку подлинности Windows для аутентификации моих пользователей через домен (isinrole).
Я видел все другие темы в этой теме, где предлагается установить Pooling = False. Я не хочу этого делать, и я хотел бы продолжать использовать пул из-за преимуществ производительности.
Я использую Entity Framework 6 для запроса базы данных, и я не "распоряжаю" dbcontext в любом месте кода пользователя. Похоже, проблема заключается в коде DbConnectionPool.
Ошибка происходит случайным образом в любой момент времени. Не имеет значения, используется ли приложение или нет. Иногда из-за этой проблемы я должен перезапустить IIS, потому что новые пользователи перестают проходить аутентификацию.
Что я пробовал до сих пор:
- Проверьте, удаляется ли объект транзакции DB.
- Проверьте, не установлен ли DBContext (ctx) преждевременно.
- Проверьте сборку приложения (32/62 бит). В этом случае я создаю приложение в ЛЮБОМ режиме процессора, а мой сервер - 64-битный.
Примечание. В моем приложении я в основном использовал объекты linq-to-EF для запроса БД.
Exception: System.Threading.SemaphoreFullException
Message: Adding the specified count to the semaphore would cause it to exceed its maximum count.
StackTrace: at System.Threading.Semaphore.Release(Int32 releaseCount)
at System.Data.ProviderBase.DbConnectionPool.CleanupCallback(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
Любая помощь в этом отношении будет принята с благодарностью.