В SDK есть пример, который может быть полезен в вашем случае. По сути, он прикрепляет реализацию IErrorHandler к вашей службе, которая будет перехватывать ошибку, когда WCF объявляет сообщение «ядовитым» (т. Е. Когда все настроенные повторные попытки исчерпаны). В этом примере выполняется перемещение сообщения в другую очередь, а затем перезапуск ServiceHost, связанного с сообщением (поскольку при обнаружении подозрительного сообщения произойдет сбой).
Это не очень красивый пример, но он может быть полезен. Однако есть несколько ограничений:
1- Если у вас есть несколько конечных точек, связанных с вашей службой (то есть через несколько очередей), нет способа узнать, в какую очередь поступило сообщение о сбое. Если у вас есть только одна очередь, это не будет проблемой. , Я не видел никакого официального обходного пути для этого, но я экспериментировал с одной возможной альтернативой, которую я задокументировал здесь: http://winterdom.com/weblog/2008/05/27/NetMSMQAndPoisonMessages.aspx
2- После того, как сообщение о проблеме перемещено в другую очередь, оно становится вашей ответственностью, поэтому вы можете переместить его обратно в очередь обработки после истечения времени ожидания (или присоединить новый сервис к этой очереди, чтобы обработать его ).
Если честно, в любом случае, вы смотрите здесь на какую-то «ручную» работу, которую WCF просто не покрывает самостоятельно.
Недавно я работал над другим проектом, в котором у меня есть требование явно контролировать частоту повторных попыток, и мое текущее решение состояло в том, чтобы создать набор очередей повторений и вручную перемещать сообщения между очередями повторов и основной обработкой. очередь, основанная на наборе таймеров и некоторой эвристике, просто использующая сырье System.Messaging для обработки очередей MSMQ. Кажется, это работает довольно хорошо, хотя есть несколько ошибок, если вы пойдете этим путем.