我正在考虑一个项目,在该项目中我将被要求使用各种称为“异步”模式、“双工”模式或 SOAP Web 服务的“回调”模式。在这种模式下,服务的调用者在 SOAP 标头中提供一个“回复”地址,并且服务不会在 HTTP 响应中返回调用的输出,而是创建一个到该“回复”的单独 HTTP 连接" 地址并向其发布响应消息。这通常在 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 消息语义或更改协议实现。这种交互正是在 WS-Addressing 中实现ReplyTo 标头时的意图。
你会怎么做?也许 Workflow Foundation 支持这种事情?