
// 重写抽象类的DiscoveryProxy的abstract方法。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

public class DiscoveryProxyService : DiscoveryProxy

{

// 存储服务地址和元数据信息

Dictionary<EndpointAddress, EndpointDiscoveryMetadata> onlineServices;

public DiscoveryProxyService()

{

this.onlineServices = new Dictionary<EndpointAddress, EndpointDiscoveryMetadata>();

}

// 接收到服务通告消息调用OnBeginOnlineAnnouncement

protected override IAsyncResult OnBeginOnlineAnnouncement(DiscoveryMessageSequence messageSequence, EndpointDiscoveryMetadata endpointDiscoveryMetadata, AsyncCallback callback, object state)

{

this.AddOnlineService(endpointDiscoveryMetadata);

return new OnOnlineAnnouncementAsyncResult(callback, state);

}

// 接收到离线消息时候调用OnBeginOfflineAnnouncement

protected override IAsyncResult OnBeginOfflineAnnouncement(DiscoveryMessageSequence messageSequence, EndpointDiscoveryMetadata endpointDiscoveryMetadata, AsyncCallback callback, object state)

{

this.RemoveOnlineService(endpointDiscoveryMetadata);

return new OnOfflineAnnouncementAsyncResult(callback, state);

}

// 接受到查找消息调用OnBeginFind

protected override IAsyncResult OnBeginFind(FindRequestContext findRequestContext, AsyncCallback callback, object state)

{

this.MatchFromOnlineService(findRequestContext);

return new OnFindAsyncResult(callback, state);

}

//新增服务

void AddOnlineService(EndpointDiscoveryMetadata endpointDiscoveryMetadata)

{

lock ( this.onlineServices)

{

this.onlineServices[endpointDiscoveryMetadata.Address] = endpointDiscoveryMetadata;

}

PrintDiscoveryMetadata(endpointDiscoveryMetadata, "Adding");

}

//移除服务

void RemoveOnlineService(EndpointDiscoveryMetadata endpointDiscoveryMetadata)

{

if (endpointDiscoveryMetadata != null)

{

lock ( this.onlineServices)

{

this.onlineServices.Remove(endpointDiscoveryMetadata.Address);

}

PrintDiscoveryMetadata(endpointDiscoveryMetadata, "Removing");

}

}

//打印服务

void PrintDiscoveryMetadata(EndpointDiscoveryMetadata endpointDiscoveryMetadata, string verb)

{

Console.WriteLine( "********<" + verb + " service of the following type");

foreach (XmlQualifiedName contractName in endpointDiscoveryMetadata.ContractTypeNames)

{

Console.WriteLine( "********" + contractName.ToString());

break;

}

Console.WriteLine( "********Done");

}

}