Я рассматриваю проект, в котором мне потребуется использовать то, что по-разному называется «асинхронным» режимом, или «дуплексным» режимом, или режимом «обратного вызова» веб-службы SOAP. В этом режиме вызывающая служба предоставляет в заголовке SOAP адрес «reply-to», и служба вместо возврата результата вызова в HTTP-ответе создает отдельное HTTP-соединение с этим «reply-to». "адрес и отправляет ответное сообщение на него. Обычно это достигается в WCF с помощью CompositeDuplexBinding, например:
<binding name="async_http_text">
<compositeDuplex clientBaseAddress="http://192.168.10.123:1234/async" />
<oneWay />
<textMessageEncoding messageVersion="Soap12WSAddressing10" />
<httpTransport useDefaultWebProxy="false" />
</binding>
В результате получается не одно, а два HTTP-соединения на вызов: одно от клиента к службе, а затем одно от службы обратно к клиенту. С точки зрения реализации сервиса, ничего не меняется, у вас есть метод, который реализует метод интерфейса, и вы принимаете запрос и возвращаете ответ. Фантастика, это то, что мне нужно, почти.
В моей ситуации запрос и ответ могут быть разделены чем-либо от минут до дней. Мне нужен способ отделить запрос и ответ и «сохранить» состояние (сообщение, URI ответа и т. Д.), Пока у меня не будет достаточно информации, чтобы ответить позже (или даже никогда, при определенных обстоятельствах).
Меня не очень радует то, что мои методы по сути "приостанавливаются" на несколько дней одновременно с необходимыми глупыми значениями тайм-аута (если они даже приняты как действительные), но я не знаю, как чтобы собрать такую систему вместе.
Для полной ясности я реализую набор стандартов, предоставляемых органом по стандартизации, поэтому у меня нет гибкости для изменения семантики сообщений SOAP или для реализации протоколов. Такое взаимодействие является именно тем, что было задумано, когда заголовок ReplyTo был реализован в WS-Addressing.
Как бы вы это сделали? Возможно, Workflow Foundation обеспечивает такие возможности?