0

我正在通过消息总线扩展 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方法?

顺便说一句,我注意到对于 IsOneWay = true 方法的请求消息,MessageID 为 NULL。我为请求消息设置了一个新 ID,但没有运气,仍然没有调用服务代码。

4

2 回答 2

2

好吧,我终于知道了原因和解决方案。

WCF 将根据整个服务契约选择最佳通道形状,而不是您调用的服务操作。因此,如果我有一个混合了 IsOneWay = true 和 IsOneWay = false 方法的服务合同,WCF 将使用请求-回复模式,因为它可以涵盖所有可能的调用。

接下来,当 WCF 使用 request-reply 模式处理单向消息时,回复消息将为空。这意味着在 RequestContext.Reply 方法中,来自参数的传入消息为空。所以我们不能像在正常的请求-回复模式下那样处理它(在那种模式下,回复消息不应该为空)。现在我们需要向底层传输发送一条空白消息,以使服务器端进程继续进行。

And on the client side, in RequestChannel.Request method we should also handle the blank message we sent from the RequestContext.Reply in this case. Just return null should be OK.

于 2012-03-21T07:31:16.410 回答
1

在我看来,您有一种已经可行的解决方案 - 将您的单向操作与您的请求-响应操作分离为不同的服务合同。

您的操作之间的通信模式的差异表明,无论在技术上是否可行,您都不应该将这些操作一起暴露在同一个服务中。

更新

从您的评论中听起来您正在尝试实施类似的转发服务?如果有,你读过这个吗? https://dzone.com/articles/single-wcf-generic-endpoint-on

于 2012-02-20T09:07:45.420 回答