MsmqException (0xC00E0051) через 60 секунд - PullRequest
3 голосов
/ 14 июля 2011

Я использую netMsmqBinding с транзакционной очередью, и хотя служба WCF вызывается без проблем, служба генерирует исключение MsmqException через 60 секунд после обработки сообщения.

Это исключение:

System.ServiceModel.MsmqException (0xC00E0051): Произошла ошибка при получении сообщения из очереди: Нераспознанная ошибка -1072824239 (0xc00e0051).Убедитесь, что MSMQ установлен и работает.Убедитесь, что очередь доступна для получения.в System.ServiceModel.Channels.MsmqInputChannelBase.TryReceive (тайм-аут TimeSpan, сообщение и сообщение) в System.ServiceModel.Dispatcher.InputChannelBinder.TryReceive (тайм-аут TimeSpan, RequestContext & requestContext) в System.ServiceModelxtReContainer.ReaderSign)

Я провел некоторое исследование, отладку и трассировку и обнаружил, что при получении нового сообщения открываются две транзакции, первая совершается сразу после выполнения службы,но второй никогда не фиксируется, поэтому через 60 секунд код DTC прерывает его, выдавая исключение MsmqException.Это определение операции:

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SomeOperation(SomeParameter parameter)
{
  // business logic
}

Есть идеи о том, что происходит и как я могу решить эту проблему?

ОБНОВЛЕНИЕ:

Конфиг:

<netMsmqBinding>
  <binding name="TransactionalMsmqBinding" exactlyOnce="true" deadLetterQueue="System" receiveErrorHandling="Move">
    <security mode="None"/>
  </binding>
</netMsmqBinding>
...
<service name="SomeNamespace.SomeService">
  <endpoint contract="SomeNamespace.ISomeService" bindingConfiguration="TransactionalMsmqBinding" binding="netMsmqBinding" address="net.msmq://localhost/private/services/someservice.svc">
  </endpoint>
  <endpoint contract="SomeNamespace.IAnotherService" bindingConfiguration="TransactionalMsmqBinding" binding="netMsmqBinding" address="net.msmq://localhost/private/services/anotherservice.svc">
  </endpoint>
</service>

Реализация сервиса:

[ExceptionShieldingBehavior(typeof(ArgumentValidationException), typeof(ValidationServiceException))]
[AuthorizationAndAuditBehaviour]
[ServiceBehavior(Namespace = GlobalConstants.ServiceContractNamespace)]
public class SomeService: ISomeService, IAnotherService
{
  [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
  public void SomeOperation(SomeParameter parameter)
  {
    // business logic
  }

  [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
  public void AnotherOperation(AnotherParameter parameter)
  {
    // business logic
  }
}

Контракты на обслуживание:

[ServiceContract(Namespace = GlobalConstants.ServiceContractNamespace)]
public interface ISomeService
{
  [OperationContract(IsOneWay = true)]
  void SomeOperation(SomeParameter parameter);
}

[ServiceContract(Namespace = GlobalConstants.ServiceContractNamespace)]
public interface IAnotherService
{
  [OperationContract(IsOneWay = true)]
  void AnotherOperation(AnotherParameter parameter);
}

Полное поведение :

  1. Клиент отправляет сообщение
  2. Служба активирована
  3. DTC запускает две транзакции (я вижу их на мониторе DTC и в событии TransactionManager.DistributedTransactionStarted)
  4. Первая транзакция завершается, как только операция завершается
  5. Вторая транзакция прерывается через 60 секунд после (MsmqException выбрасывается)
  6. Иногда происходит сбой узла wcf (IIS) (у меня есть некоторыекод автоматически восстанавливает его , очевидно, это поведение изменилось в .net 4)
    • Если хост был сломан и автоматически восстановлен, все произойдет снова при следующем сообщении
    • Если хозяин не был сломан,вторая транзакция не запустится в следующий раз, и все будет работать без проблем:).
    • Если я перезапущу AppPool, проблема начнется снова

1 Ответ

0 голосов
/ 20 июля 2011

Я нашел проблему.

Поскольку я предоставляю одну и ту же Службу с использованием двух разных конечных точек msmq, по какой-то странной причине процесс SMSvcHost.exe дважды активирует одну и ту же конечную точку.

Я только что написал сообщение с решением: http://blog.jorgef.net/2011/07/msmqexception.html

Надеюсь, это поможет.

Jorge

...