WCF WF исключение корреляции службы - PullRequest
0 голосов
/ 11 мая 2011

При обработке нескольких push-уведомлений с сервера Exchange в службе WF WCF я получаю следующее исключение, и WF прерывается:

«Некоторый контекст в обработчике корреляции использовался неправильно». Никакой документации по этой ошибке нигде не видно.

Полное сообщение: System.ServiceModel.FaultException`1 [System.ServiceModel.ExceptionDetail]: Некоторый контекст в обработчике корреляции не был использован должным образом. Убедитесь, что обработчик был правильно инициализирован во время выполнения, и рабочий процесс имеет отправку, за которой следует действие Receive или ReceiveReply. (Сведения об ошибке равны ExceptionDetail, вероятно, созданный IncludeExceptionDetailInFaults = true, значение которого равно: System.InvalidOperationException: Некоторый контекст в обработчике корреляции не использовался должным образом. Убедитесь, что обработчик был правильно инициализирован во время выполнения, и рабочий процесс имеет отправку, за которой следует действие Receive или ReceiveReply. в System.Runtime.AsyncResult.End [TAsyncResult] (результат IAsyncResult) в System.ServiceModel.Activities.Dispatcher.ControlOperationInvoker.ControlOperationAsyncResult.End (Object [] & output, результат IAsyncResult) в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeEnd (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage7 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.MessageRpc.Process (логическое значение isOperationContextSet)).

1 Ответ

0 голосов
/ 13 мая 2011

ОК, я понял это. Короче говоря, то, что происходило, было условием гонки, когда прием с корреляцией запроса и корреляции запрос-ответ обрабатывал несколько сообщений с одинаковым идентификатором корреляции, сидя в цикле выполнения. Цель состояла в том, чтобы обработать первое из множества сообщений с одинаковым идентификатором, отбрасывая остальные. Первое сообщение вызвало запуск параллельного процесса, подняв флаг для ожидающей последовательности (с ответом «Отправить ответ» через секунду), в то время как последующие сообщения были отброшены (с ответом «Отправить ответ»).

Проблема заключалась в том, что второе сообщение приходило до того, как прошел первый SendReply. Это заставило инициализатор корреляции перезаписать обработчик корреляции запроса ответа, который должен был использовать первый. Похоже, именно это и вызывает вышеупомянутое исключение. Я временно исправил это, заставив SendReply произойти немедленно, хотя, когда у меня будет время, я посмотрю на использование нескольких обработчиков корреляции для получения ответа. (Словарь обработчиков, основанный на некотором идентификаторе сообщения ??)

...