首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果IsOneWay = true,则未调用WCF服务代码

如果IsOneWay = true,则未调用WCF服务代码
EN

Stack Overflow用户
提问于 2012-02-20 16:31:49
回答 2查看 536关注 0票数 0

我正在消息总线上扩展WCF传输,请求-应答模式对我来说工作得很好。当我实现输入-输出模式时,我遇到了一个问题。情况是这样的:

1,我创建了InputChannel和OutputChannel,并让TransportBindingElement返回它们。

2、我创建了一个contract接口,它有两个方法。一个的属性是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为空。我为请求消息设置了一个新的ID,但是没有成功,服务代码仍然没有被调用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-21 15:31:16

好吧,我终于找到了原因和解决方案。

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-02-20 17:07:45

在我看来,您有一种已经有效的解决方案-将单向操作与请求-响应操作解耦到不同的服务契约中。

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

更新

从你的评论中听起来像是你在尝试实现类似的转发服务?如果有,你有没有读过thishttps://dzone.com/articles/single-wcf-generic-endpoint-on

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9358116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档