【问题标题】:WCF service code was not invoked if it's IsOneWay = true如果 IsOneWay = true,则不会调用 WCF 服务代码
【发布时间】:2012-02-20 08:31:49
【问题描述】:

我正在通过消息总线扩展 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会给我request-reply channel,对吗?

2,如何处理服务调用,方法是IsOneWay = true,但在同一个服务合同中也有IsOneWay = false方法?

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

【问题讨论】:

    标签: wcf wcf-extensions


    【解决方案1】:

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

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

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

    在客户端,在 RequestChannel.Request 方法中,我们还应该在这种情况下处理从 RequestContext.Reply 发送的空白消息。只需返回 null 就可以了。

    【讨论】:

      【解决方案2】:

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

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

      更新

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

      【讨论】:

      • 是的,在实践中,最好的方法是让服务仅用于请求-回复,而另一种仅用于一种方式。但是你知道我在实现一个自定义的传输层,这意味着我最好支持各种服务实现和主机。如果 WCF 允许用户在一项服务中有请求-回复和单向,我应该支持它,即使它不是最好的方式。
      • 谢谢 Hugh,但我没有实现路由服务。事实上,我正在尝试扩展 WCF 以使用企业消息总线作为传输层。因此,我的扩展应该能够让开发人员通过我的传输运行他们的各种服务。如果可以在一个服务合同中同时定义 IsOneWay = true 和 false ,我必须支持它。而且我认为内置的传输,比如HTTP、NET.TCP和MSMQ应该都支持。
      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2017-02-05
      相关资源
      最近更新 更多