У меня есть служба WCF со сложным контрактом операции, который должен выполняться атомарно, т. Е. Либо вся операция завершается успешно, либо не выполняется. Служба WCF размещается на сервере IIS в приложении ASP .NET . Эта операция имеет последовательность команд SQL, которые выполняются в транзакции. Во время тестов я обнаружил, что при одновременном доступе от 4 до 5 пользователей, по крайней мере, один пользователь получает ошибку «тупик транзакции».
Затем я посмотрел на настройки serviceThrottling , которые я установил на
<serviceThrottling maxConcurrentCalls ="5" maxConcurrentInstances ="50" maxConcurrentSessions ="5" />
и изменил его на
<serviceThrottling maxConcurrentCalls ="1" maxConcurrentInstances ="1" maxConcurrentSessions ="1" />
Я отключил сеанс, поскольку мне не нужен контракт на обслуживание. Так что я не знаю, будет ли maxConcurrentSessions иметь какой-либо эффект
<ServiceContract([Namespace]:="http://www.8343kf393.com", SessionMode:=SessionMode.NotAllowed)>
Таким образом, я ставил запросы в очередь, чтобы запрос обрабатывался последовательно, а не одновременно. В то время как проблема транзакции исчезла, время процесса увеличилось, что и ожидалось.
Мне было интересно
Является ли serviceThrottling единственным способом решения этой проблемы?
Как настроить serviceThrottling таким образом, чтобы служба одновременно принимала много запросов, но обрабатывала по одному?
Уместно ли здесь задавать InstanceContextMode = InstancePerContext.PerCall , поскольку приложение является приложением ASP .Net, которое само по себе является многопоточным?