Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере обнаружения "Базовый" показано, как сделать службу обнаруживаемой и как искать и вызывать обнаруживаемую службу. Этот пример состоит из двух проектов: службы и клиента.
Замечание
Этот пример реализует обнаружение в коде. Пример, реализующий обнаружение в конфигурации, см. в разделе "Конфигурация".
Услуга
Это простая реализация службы калькулятора. Связанный с обнаружением код можно найти в 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, и для запуска этого примера необходимо добавить правильные списки управления доступом (ACL) для URL. Дополнительные сведения см. в разделе "Настройка HTTP и HTTPS". При выполнении следующей команды с повышенными привилегиями необходимо добавить соответствующие списки управления доступом. Вы можете заменить домен и имя пользователя в аргументах, если команда не работает в исходном виде.
netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%С помощью Visual Studio откройте Basic.sln и создайте пример.
Запустите приложение service.exe.
После запуска службы запустите client.exe.
Обратите внимание, что клиент смог найти службу, не зная его адреса.