#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. Спасибо за информацию. Очевидно, я ранее не видел вашего комментария, но ваше объяснение имеет смысл, и я ценю вашу помощь.