WCF + Spring.NET вызывает периодические исключения System.Transaction - PullRequest
1 голос
/ 27 января 2012

Я уже некоторое время без проблем использую декларативные транзакции Spring.NET в веб-приложении.Рекомендации по транзакциям применяются исключительно к методам уровня обслуживания.

Недавно мы развернули две службы WCF, которые используют наши объекты управляемой службы Spring в качестве зависимостей.Мы используем Spring.ServiceModel.Activation.ServiceHostFactory для создания экземпляров этих сервисов в соответствии с примерами Spring.NET.

Вскоре после развертывания этих сервисов на производстве мы столкнулись с периодическими ошибками класса AdoPlatformTransactionManager, который управляет транзакциями Spring.

Текст ошибки:

    System.ObjectDisposedException: Cannot access a disposed object.
    Object name: 'Transaction'.
       at System.Transactions.Transaction.get_IsolationLevel()
       at System.Transactions.TransactionScope..ctor(TransactionScopeOption scopeOption, TransactionOptions 
at AdoPlatformTransactionManager.DoBegin(Object transaction, ITransactionDefinition definition)
at Spring.Transaction.Support.AbstractPlatformTransactionManager.GetTransaction(ITransactionDefinition definition) 

Эти ошибки периодически и кажутся коррелированными с текущей загрузкой сервера (чем больше пользователей, тем выше вероятность воспроизведения).Кроме того, мы не видели таких исключений ни в одном из наших вызовов методов службы, не инициированных WCF.Пока у меня есть две очень шаткие теории:

  • Создание экземпляров / область объектов WCF (PerCall) не очень хорошо работает с объектами-сервисами-одиночками
  • Некоторая проблема параллелизмав котором несколько экземпляров службы WCF могут вмешиваться в окружающие транзакции других не связанных между собой экземпляров (потоковое локальное хранилище?)

Поиск этой ошибки и поиск по наиболее заброшенным форумам поддержки Spring.NET ничего не дали,так что любая помощь или идеи приветствуются!

Обновление 1

Сделали немного больше отладки и получили больше ясности в этом вопросе.Похоже, что настоящая проблема связана не с транзакциями, а с восстановлением каналов WCF из неисправного состояния.

Каждый раз, когда возникает необработанное исключение во время вызова метода WCF (в моем случае это было нарушение FK), канал, кажется, остается в постоянно сбойном состоянии.

Что еще хуже, когда канал переходит в неисправное состояние, это влияет на всех пользователей этой службы, поскольку Spring.NET не создает новый канал для каждого пользователя.Похоже, что единственный способ решить эту проблему - перезапустить пул приложений.

На основании ссылок, указанных ниже, я не уверен, что проблема в Spring.NET, сбой WCF в целом или что-то ещеполностью.

Ссылки

Время ожидания клиента при использовании wcf-through-spring-net

Лучший-Practices-and-Recover-a-Failed-Channel

что такое лучший обходной путь для wcf-клиента, использующего проблему блока

1 Ответ

1 голос
/ 27 января 2012

Вы объявили свои сервисы, экспортированные ServiceHostFactory, как объект-прототип, то есть не как единичный объект, чтобы правильно взаимодействовать с экземплярами WCF?

<object id="calculator" singleton="false" type="Spring.WcfQuickStart.CalculatorService, Spring.WcfQuickStart.ServerApp">
  <property name="SleepInSeconds" value="1"/>
</object>
...