Сообщение WCF MSMQ обрабатывалось несколько раз

#c# #wcf #msmq

#c# #wcf #msmq

Вопрос:

У меня есть программа WCF, с которой осуществляется связь через MSMQ. По какой-то причине несколько сообщений обрабатываются несколько раз без видимой причины. Никаких ошибок не выдается, и я подтвердил, что приложение входит в operationBehaivior и выходит из него без каких-либо ошибок.

Например, я отправлю 1 сообщение через MSMQ, приложение получит его и успешно обработает, затем по какой-то причине обработает его снова (иногда несколько раз, иногда без обработки)

Здесь определяются соответствующие поведения и контракты:

 [ServiceContract]
public interface IApp
{

    [OperationContract(IsOneWay = true)]
    void ProcessMessage(List<AppData> appInfo);

}

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class ProcessInfo : IApp
{
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void ProcessMessage(List<AppData> appInfo)
    {
      try
      {
           app logic
      }
      catch(Exception e)
      {
      }



    }
  

Похоже, что сообщения MSMQ, которые обрабатываются несколько раз, имеют количество прерываний > 0 или помещаются в очередь повторных попыток, однако я никогда не получаю сообщение об ошибке о том, почему это происходит.

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

Комментарии:

1. Оказывается, это было вызвано слишком коротким временем ожидания привязки WCF. Как только я увеличил время ожидания как на клиенте, так и на сервере, оно начало работать идеально. Единственный момент, который меня все еще смущает, заключается в том, что на клиенте или сервере не было выдано ошибок, указывающих на эту проблему. Есть идеи относительно того, почему это не выдаст ошибку?

Ответ №1:

Вы обнаружили, что ваша проблема заключалась в превышении времени ожидания привязки, и вы спросили, почему вы не видите никаких исключений в коде вашего клиента или службы. Вот объяснение этого:

С точки зрения клиента, сообщение является односторонним и было успешно доставлено в очередь. Это все, что имеет значение с точки зрения клиента. Клиент никогда не увидит, что при обработке сообщения на стороне сервера произошло исключение.

С точки зрения сервиса, вы не видели исключений в своем коде, потому что время ожидания обрабатывается на уровне времени выполнения WCF. Ваш код завершает свое выполнение нормально (WCF не собирается прерывать выполняющийся поток или что-то еще), но что касается среды выполнения WCF, это заняло слишком много времени, и поэтому доставку сообщения необходимо повторить еще раз. Тем не менее, вы наверняка увидите ошибки в журнале событий и, если включено, в журналах трассировки служб, указывающих на то, что произошел тайм-аут.

Комментарии:

1. Спасибо за информацию. Очевидно, я ранее не видел вашего комментария, но ваше объяснение имеет смысл, и я ценю вашу помощь.