WCF点对点,那里有节点吗?

pet*_*ter 6 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

我使用这样的代码将每个节点加入到对等网络.

DuplexChannelFactory<IGlobalStoreChannel> channelFactory = new DuplexChannelFactory<IGlobalStoreChannel>(instance, "GlobalStoreAPIEndPoint");
IGlobalStoreChannel globalStoreChannel = channelFactory.CreateChannel();

globalStoreChannel.Open();
Run Code Online (Sandbox Code Playgroud)

我的问题是,一旦打开频道,我怎样才能最好地判断网络上是否存在其他对等节点?

例如,我可以调用我的合同RegisterNode中的一个方法,并且网络中的每个节点都可以使用回调来调用SynchronizeMemberList.然后我会知道是否有其他节点.

问题在于它是异步的.如果我调用RegisterNode并且没有人回复,那并不意味着没有人在那里,这可能只是意味着我没有等待足够长的时间.

你怎么看?有什么建议?

Eug*_*ota 5

请参阅使用WCF和.NET Framework 3.5进行对等编程: Amit Bahree和Chris Peiris的对等名称:

创建和发布对等体之后的最后一个逻辑步骤是解析对等体.如果另一个同行找不到您,将内容发布到云端有什么用呢?我们使用 PeerNameResolver该类来解析给定云中的特定对等体.该 PeerNameResolver可以解决对到任何一个PeerRecord或云,这取决于所传递的参数.当达到最大记录条目数PeerRecordCollection或达到各种云结束时,解析过程结束 .

所述PeerNameResolver类暴露一个重载的方法被称为Resolve并且被用于同步地解决给定对等体.

清单17向我们展示了如何尝试解析被调用的对等体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());
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我想你应该看看PeerNameResolver.Resolve方法:

此方法将对等名称与云相关联.调用该PeerNameResolver 方法类似于Resolve为该中的每个对等名称记录调用该 方法 PeerNameRecordCollection.请注意,Resolve在单个对等名称记录上使用该方法不会使解析多个对等名称无效.

对于每种Resolve方法,都有一种等效的ResolveAsync方法.它们在传递的参数中是相同的,除了该 ResolveAsync方法在其参数列表中包含用于异步事件处理的系统令牌.