Фон: я пытаюсь перенаправить серверную часть ApplyChangeFailed, которое запускается службами синхронизации для ADO 1.0 DBServerSyncProvider для клиента. Все примеры кода для разрешения конфликтов служб синхронизации не используют WCF, и когда клиент напрямую подключается к базе данных сервера, этой проблемы не существует. Однако мой DBServerSyncProvider обернут безголовой службой WCF, и я не могу показать пользователю диалоговое окно с неверными данными для проверки.
Итак, очевидное решение, казалось, заключалось в преобразовании службы HTTP WCF, созданной службами синхронизации, в TCP, создании дуплексного соединения и определении обработчика обратного вызова на клиенте, который получает SyncConflict и задает свойство Action события.
Когда я это сделал, я получил ошибку времени выполнения (до попытки обратного вызова):
System.InvalidOperationException: эта операция заблокируется, поскольку ответ не может быть получен, пока текущее сообщение не завершит обработку. Если вы хотите разрешить обработку сообщений не по порядку, укажите ConcurrencyMode Reentrant или Multiple в CallbackBehaviorAttribute.
Поэтому я сделал то, что было предложено в сообщении, и украсил сервис и поведение обратного вызова атрибутом Multiple. Затем ошибка времени выполнения исчезла, но вызов приводит к «тупиковой ситуации» и никогда не возвращается. Что мне делать, чтобы обойти это? Разве нельзя иметь службу WCF, которая перезванивает клиенту до возврата исходного вызова службы?
Изменить: я думаю, что это может быть объяснением проблемы, но я до сих пор не уверен, каким должно быть правильное решение.