WCF点对点,那里有节点吗?
我在.NET 3.5中使用WCF来实现对等网络应用程序。 要解析对等节点,我使用的是PNRP。
IGlobalStoreServiceContract是我的合同,如下所示,
[ServiceContract(Namespace = "http://GlobalStoreEventDriven.API", CallbackContract = typeof(IGlobalStoreServiceContract))] internal interface IGlobalStoreServiceContract { [OperationContract(IsOneWay = true)] void NotifyGlobalStoreDataInserted(string globalGroup, DateTime maxDateTime); [OperationContract(IsOneWay = true)] void RegisterNode(); [OperationContract(IsOneWay = true)] void SynchronizeMemberList(Guid clientId); }
我使用这样的代码将每个节点加入到对等网络。
DuplexChannelFactory channelFactory = new DuplexChannelFactory(instance, "GlobalStoreAPIEndPoint"); IGlobalStoreChannel globalStoreChannel = channelFactory.CreateChannel(); globalStoreChannel.Open();
我的问题是,一旦打开频道,我怎样才能最好地判断网络上是否存在其他对等节点?
例如,我可以调用我的合同RegisterNode中的一个方法,并且网络中的每个节点都可以使用回调来调用SynchronizeMemberList。 然后我会知道是否有其他节点。
麻烦就是它都是异步的。 如果我调用RegisterNode并且没有人回复,那并不意味着没有人在那里,这可能只是意味着我没有等待足够长的时间。
你怎么看? 有什么建议?
请参阅使用WCF和.NET Framework 3.5进行对等编程: Amit Bahree和Chris Peiris的对等名称 :
创建和发布对等体之后的最后一个逻辑步骤是解析对等体。 如果另一个同行找不到你,那么将某些东西发布到云端有什么用? 我们使用
PeerNameResolver
类来解析给定云中的特定对等体。PeerRecord
可以PeerRecord
等体解析为PeerRecord
或云,具体取决于传递的参数。 当达到PeerRecordCollection
的最大记录条目数或到达各种云的末尾时,解析过程结束。
PeerNameResolver
类公开了一个名为Resolve
的重载方法,用于同步解析给定的对等方。清单17向我们展示了如何尝试解析名为
MySecurePeer
的对等MySecurePeer
。 Resolve方法返回一个PeerNameRecordCollection
类型的集合,我们通过它来迭代。 清单18显示了在具有三个网卡的计算机上运行时的结果。
PeerName myPeer = new PeerName("MySecurePeer", PeerNameType.Secured); PeerNameResolver resolver = new PeerNameResolver(); PeerNameRecordCollection results = resolver.Resolve(myPeer); Console.WriteLine("{0} Peers Found:", results.Count.ToString()); int i = 1; foreach (PeerNameRecord peer in results) { Console.WriteLine("{0} Peer:{1}", i++, peer.PeerName.ToString()); foreach (IPEndPoint ip in peer.EndPointCollection) { Console.WriteLine("\t Endpoint: {0}", ip.ToString()); } }
所以,我想你应该看看PeerNameResolver.Resolve
方法 :
此方法将对等名称与云相关联。 调用
PeerNameResolver
方法类似于为PeerNameResolver
中的每个对等名称记录调用Resolve
方法。 请注意,在单个对等名称记录上使用Resolve
方法不会使解析多个对等名称无效。对于每个
Resolve
方法,都有一个等效的ResolveAsync
方法。 除了ResolveAsync
方法在其参数列表中包含用于异步事件处理的系统标记之外,它们在传递的参数中是相同的。