我有一个WCF路由器设置,客户端使用可靠的消息传递(RMP)与WS Http绑定通信目标服务。当客户端服务到路由器的连接是WS HTTP而路由器到目标服务是WS HTTP时,所有工作都有效正如所料。我在SOAP数据包到达路由器时记录它们,它们看起来像:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:r="http://docs.oasis-open.org/ws-rx/wsrm/200702" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<r:Sequence s:mustUnderstand="1">
<r:Identifier>urn:uuid:76bac170-ace3-4a9b-8a5f-eba263cbdf57</r:Identifier>
<r:MessageNumber>1</r:MessageNumber>
</r:Sequence>
<a:Action s:mustUnderstand="1">http://tempuri.org/Foo/Connect</a:Action>
<a:MessageID>urn:uuid:d76b500f-f59e-41a1-9831-cb33e2f9eb3c</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">http://foobox:62435/RouterService.svc</a:To>
</s:Header>
<s:Body>
<Connect xmlns="http://tempuri.org/">
<!-- Request body removed -->
</Connect>
</s:Body>
</s:Envelope>
这会返回有效的回复。
问题是当我切换到客户端服务和路由器之间的HTTPS连接并保持路由器和目标服务之间的WS HTTP连接时,它正在记录WS-RM消息:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence</a:Action>
<a:MessageID>urn:uuid:96d7c674-471e-4c9d-8ba5-7a1c8ed3275b</a:MessageID>
<a:To s:mustUnderstand="1">https://foobox:44300/RouterService.svc</a:To>
</s:Header>
<s:Body>
<CreateSequence xmlns="http://schemas.xmlsoap.org/ws/2005/02/rm">
<AcksTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</AcksTo>
<Offer>
<Identifier>urn:uuid:de2129d5-58f2-4672-915f-eb3196d51bff</Identifier>
</Offer>
</CreateSequence>
</s:Body>
</s:Envelope>
这会在客户端服务中生成以下ActionNotSupported异常:
带有Action的消息 'http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence'不能 由于ContractFilter不匹配而在接收器处理 EndpointDispatcher。这可能是因为合同不匹配 (发送方和接收方之间不匹配的操作)或绑定/安全性 发送者和接收者之间不匹配。检查发件人和 接收者具有相同的合同和相同的约束力(包括 安全要求,例如消息,传输,无)。
考虑到服务接口不处理CreateSequence
消息,这个错误是有意义的,但我不确定为什么切换到SSL会导致这些消息被显式发送到目标服务。
如何让路由器正确传递/处理WS-RM数据包?
更新
WS HTTP over Transport Security(似乎)不允许可靠的消息传递(生成错误),因此客户端到路由器的连接正在使用具有可靠消息传递的HTTPS绑定。我认为问题是路由器需要将RM操作消息转换为WS HTTP消息,但我不知道如何做到这一点。
答案 0 :(得分:0)
想出来。
正面向客户端服务的路由器上的端点设置为WsHttpBinding
,而不是CustomBinding
,它使用可靠的消息传递与客户端的HTTPS绑定相匹配。在更改它以使用正确的绑定后,流量现在正在通过路由器而没有问题。