我正在消息总线上扩展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,但是没有成功,服务代码仍然没有被调用。
发布于 2012-03-21 15:31:16
好吧,我终于找到了原因和解决方案。
WCF将根据整个服务契约来选择最佳的通道形状,而不是根据您调用的服务操作。因此,如果我有一个混合了IsOneWay = true和IsOneWay = false方法的服务契约,WCF将使用请求-回复模式,因为它可以覆盖所有可能的调用。
下一步,当WCF使用请求-回复模式处理单向消息时,回复消息将为空。这意味着在RequestContext.Reply方法中,来自参数的传入消息为空。因此,我们不能像正常的请求-回复模式那样处理它(在该模式下,回复消息不应为空)。现在,我们需要向底层传输发送一条空消息,以使服务器端流程继续。
在客户端,在RequestChannel.Request方法中,我们还应该处理从RequestContext.Reply发送的空白消息。只要返回null就可以了。
发布于 2012-02-20 17:07:45
在我看来,您有一种已经有效的解决方案-将单向操作与请求-响应操作解耦到不同的服务契约中。
您的操作之间的通信模式的差异表明,无论技术上是否可行,您都不应该在同一服务中同时公开这些操作。
更新
从你的评论中听起来像是你在尝试实现类似的转发服务?如果有,你有没有读过this?https://dzone.com/articles/single-wcf-generic-endpoint-on
https://stackoverflow.com/questions/9358116
复制相似问题