基本发现示例演示如何使服务可发现,以及如何搜索和调用可发现的服务。 此示例由两个项目组成:服务和客户端。
注释
此示例在代码中实现发现。 有关在配置中实现发现的示例,请参阅 “配置”。
服务
这是一个简单的计算器服务实现。 可以在Main
中找到与发现相关的代码,添加ServiceDiscoveryBehavior到服务主机,并添加UdpDiscoveryEndpoint,如以下代码所示。
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new
WSHttpBinding(), String.Empty);
// Make the service discoverable over UDP multicast
serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
serviceHost.Open();
// ...
}
客户
客户端使用DynamicEndpoint来定位服务。 标准终结点 DynamicEndpoint 在打开客户端时解析服务的终结点。 在这种情况下,DynamicEndpoint 根据服务协议查找服务。 默认情况下,DynamicEndpoint 对 UdpDiscoveryEndpoint 进行搜索。 找到服务终结点后,客户端通过指定的绑定连接到该服务。
public static void Main()
{
DynamicEndpoint dynamicEndpoint = new DynamicEndpoint( ContractDescription.GetContract(typeof(ICalculatorService)), new WSHttpBinding());
// ...
}
客户端定义一个调用 InvokeCalculatorService
的方法,该方法使用 DiscoveryClient 类搜索服务。 继承 DynamicEndpoint 自 ServiceEndpoint,因此可以将其传递给 InvokeCalculatorService
方法。 然后,该示例使用 DynamicEndpoint 创建 CalculatorServiceClient
的实例,并调用计算器服务的各种操作。
static void InvokeCalculatorService(ServiceEndpoint serviceEndpoint)
{
// Create a client
CalculatorServiceClient client = new CalculatorServiceClient(serviceEndpoint);
Console.WriteLine("Invoking CalculatorService");
Console.WriteLine();
double value1 = 100.00D;
double value2 = 15.99D;
// Call the Add service operation.
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
// Call the Subtract service operation.
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
// Call the Multiply service operation.
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
// Call the Divide service operation.
result = client.Divide(value1, value2);
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
Console.WriteLine();
//Closing the client gracefully closes the connection and cleans up resources
client.Close();
}
使用此示例
此示例使用 HTTP 终结点并运行此示例,必须添加适当的 URL ACL。 有关详细信息,请参阅 配置 HTTP 和 HTTPS。 在提升的权限下执行以下命令应添加相应的 ACL。 如果命令不按原样工作,则可能需要将域和用户名替换为以下参数。
netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%
使用 Visual Studio 打开Basic.sln并生成示例。
运行 service.exe 应用程序。
服务启动后,运行 client.exe。
请注意,客户端能够在不知道服务地址的情况下找到该服务。