公告示例演示如何使用发现功能的公告功能。 公告允许服务发送包含有关服务的元数据的公告消息。 默认情况下,服务启动时会发送 hello 公告,并在服务关闭时发送 bye 公告。 这些公告可以是多播,也可以发送点到点。 此示例由两个项目服务和客户端组成。
服务
此项目包含自托管计算器服务。 在 Main 方法中,将创建服务主机,并将服务终结点添加到其中。 接下来创建 ServiceDiscoveryBehavior。 若要启用公告,必须向 ServiceDiscoveryBehavior 添加公告终结点。 在此例中,添加一个标准终结点(使用 UDP 多播)作为公告终结点。 这会通过已知的 UDP 地址广播公告。
Uri baseAddress = new Uri("http://localhost:8000/" + Guid.NewGuid().ToString());
// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new WSHttpBinding(), String.Empty);
ServiceDiscoveryBehavior serviceDiscoveryBehavior = new ServiceDiscoveryBehavior();
// Announce the availability of the service over UDP multicast
serviceDiscoveryBehavior.AnnouncementEndpoints.Add(new UdpAnnouncementEndpoint());
// Make the service discoverable over UDP multicast.
serviceHost.Description.Behaviors.Add(serviceDiscoveryBehavior);
serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
serviceHost.Open();
// ...
}
客户
在此项目中请注意,客户端承载 AnnouncementService。 此外,会向事件注册两个委托。 这些事件决定了客户端在收到在线和离线公告时执行的操作。
// Create an AnnouncementService instance
AnnouncementService announcementService = new AnnouncementService();
// Subscribe the announcement events
announcementService.OnlineAnnouncementReceived += OnOnlineEvent;
announcementService.OfflineAnnouncementReceived += OnOfflineEvent;
OnOnlineEvent和OnOfflineEvent方法分别处理 hello 和 bye 公告消息。
static void OnOnlineEvent(object sender, AnnouncementEventArgs e)
{
Console.WriteLine();
Console.WriteLine("Received an online announcement from {0}:", e.AnnouncementMessage.EndpointDiscoveryMetadata.Address);
PrintEndpointDiscoveryMetadata(e.AnnouncementMessage.EndpointDiscoveryMetadata);
}
static void OnOfflineEvent(object sender, AnnouncementEventArgs e)
{
Console.WriteLine();
Console.WriteLine("Received an offline announcement from {0}:", e.AnnouncementMessage.EndpointDiscoveryMetadata.Address);
PrintEndpointDiscoveryMetadata(e.AnnouncementMessage.EndpointDiscoveryMetadata);
}
使用此示例
此示例使用 HTTP 终结点并运行此示例,必须添加适当的 URL ACL。 有关详细信息,请参阅 配置 HTTP 和 HTTPS。 在提升的权限下执行以下命令应添加相应的 ACL。 如果命令不按原样工作,则可能需要将域和用户名替换为以下参数。
netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%生成解决方案。
运行 client.exe 应用程序。
运行 service.exe 应用程序。 请注意,客户端会收到联机公告。
关闭 service.exe 应用程序。 请注意,客户端会收到脱机通知。