在WCF中获取回调通道的IP地址

4
我有一个在双工通道上的WCF服务,带有回调合同。当客户端调用服务上的SubscribeMe()方法时,服务通过将OperationContext.Current.GetCallbackChannel<T>()的结果存储在列表中来跟踪客户端。该服务将定期ping这些回调通道以跟踪它们的有效性,并过期那些已关闭或超时的通道。
我的问题是:当远程主机没有主动请求我的服务时,例如当我调用MyCallbackContract.Ping()时,如何获取有关远程主机的信息?
我尝试将回调通道对象转换为IContextChannel,并访问IContextChannel::RemoteAddress属性,但此属性包含一些与回调通道上实际远程主机无关的命名空间URI。
1个回答

5

尚未经过测试(需要花费一定时间设置所有配置!),但我认为您正在寻找类似于以下内容的东西:

OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpointProperty =
                messageProperties[RemoteEndpointMessageProperty.Name]
                as RemoteEndpointMessageProperty;

var address = endpointProperty.Address;

因此,在我的情况下,当我尝试ping客户端列表时,不应该有OperationContext.Current。它会定期调用,并且没有服务操作被调用。如果解决方案是在订阅时存储远程终结点信息,那可能是合适的。 - John Hargrove
是的,在这种情况下,当客户端连接时,请使用上面的代码(修改为使用IncomingMessageProperties集合而不是outgoing),然后您应该没问题了。很抱歉没有更多帮助,WCF并不是我的专长 :) - Nathan
这是一个有效的解决方案。我只想知道是否应该跟踪它,或者我可以依赖WCF来做到这一点。看起来回调通道应该能够告诉我这种情况。 - John Hargrove
是的,你可能认为它可以吧? :) 也许尝试在你认为应该能够到达它的地方设置断点,并尝试检查对象模型是否有用的内容? - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接