我通过消息总线扩展WCF传输,请求 - 回复模式对我很有用。当我实现输入输出模式时,我遇到了一个问题。情况是:
1,我创建了InputChannel和OutputChannel,让TransportBindingElement返回它们。
2,我创建了一个契约接口,它有两种方法。有一个属性说IsOneWay = true,让我们说它是Method1;另一个不是命名为Method2。
3,如果我调用了Method1,我可以看到它给了我一个RequestChannel和ReplyChannel而不是InputChannel和OutputChannel。并且回复通道可以接收WCF消息并返回RequestContext。但是没有调用服务代码。
4,如果我在Method1上设置IsOneWay = false,则效果很好。
4,如果我调用了Method2,它运行良好。
5,我创建了另一个服务合同,它只有一个IsOneWay = true的方法。如果我调用了这个方法,WCF给了我InputChannel和OutputChannel,它运行良好(服务代码已执行)。
所以我的问题是: 1,如果我有IsOneWay = true方法和IsOneWay = false方法的服务,WCF会给我请求 - 回复通道,这是正确的吗?
2,如何处理服务调用,该方法是IsOneWay = true,但在同一服务合同中也有IsOneWay = false方法?
BTW,我注意到对于IsOneWay = true方法的请求消息,MessageID为NULL。我为请求消息设置了一个新ID,但没有运气,服务代码仍未被调用。
答案 0 :(得分:1)
好吧,我终于得到了理由和解决方案。
WCF将根据整个服务合同选择最佳渠道形状,而不是您调用的服务操作。因此,如果我与IsOneWay = true和IsOneWay = false方法混合的服务合同,WCF将使用请求 - 回复模式,因为它可以涵盖所有可能的调用。
接下来,当WCF使用请求 - 回复模式处理单向消息时,回复消息将为空。这意味着在RequestContext.Reply方法中,来自参数的传入消息为null。因此我们无法像在正常的请求 - 回复模式中那样处理它(在该模式下,回复消息不应为空)。现在我们需要向基础传输发送空白消息,以使服务器端进程继续。
在客户端,在RequestChannel.Request方法中,我们还应该处理在这种情况下从RequestContext.Reply发送的空白消息。只返回null应该没问题。
答案 1 :(得分:0)
在我看来,您已经拥有了一个已经可行的解决方案 - 将您的单向操作与请求 - 响应操作分离到不同的服务合同中。
您的操作之间的通信模式的差异表明,无论技术上是否可行,您都不应将这些操作暴露在同一服务中。
<强>更新强>
从您的评论中听起来就像您正在尝试实施sime类型的转发服务?如果有,请阅读this?