Руководство. Размещение и запуск базовой службы Windows Communication Foundation

В этом руководстве описывается третья из пяти задач, необходимых для создания базового приложения Windows Communication Foundation (WCF). Общие сведения о руководствах см. в руководстве по началу работы с приложениями Windows Communication Foundation.

Следующая задача для создания приложения WCF — размещение службы WCF в консольном приложении. Служба WCF предоставляет одну или несколько конечных точек, каждая из которых предоставляет одну или несколько операций службы. Конечная точка службы указывает следующие сведения:

  • Адрес, в котором можно найти службу.
  • Привязка, содержащая сведения, описывающие, как клиент должен взаимодействовать со службой.
  • Контракт, определяющий функциональные возможности, которые служба предоставляет своим клиентам.

В этом руководстве описано следующее:

  • Создайте и настройте проект консольного приложения для размещения службы WCF.
  • Добавьте код для размещения службы WCF.
  • Обновите файл конфигурации.
  • Запустите службу WCF и убедитесь, что она запущена.

Создание и настройка проекта консольного приложения для размещения службы

  1. Создайте проект консольного приложения в Visual Studio:

    1. В меню "Файл" выберите "Открыть>проект или решение" и перейдите к ранее созданному решению GettingStarted (GettingStarted.sln). Выберите Открыть.

    2. В меню "Вид" выберите Обозреватель решений.

    3. В окне Обозреватель решений выберите решение GettingStarted (верхний узел), а затем выберите "Добавить>новый проект" в контекстном меню.

    4. В окне "Добавление нового проекта" в левой части выберите категорию "Рабочий стол Windows" в разделе Visual C# или Visual Basic.

    5. Выберите шаблон консольного приложения (платформа .NET Framework) и введите Метод GettingStartedHost для имени. Нажмите ОК.

  2. Добавьте ссылку в проект GettingStartedHost в проект GettingStartedLib:

    1. В окне Обозреватель решений выберите папку "Ссылки" в проекте GettingStartedHost и выберите пункт "Добавить ссылку" в контекстном меню.

    2. В диалоговом окне "Добавить ссылку" в разделе "Проекты" в левой части окна выберите "Решение".

    3. Выберите GettingStartedLib в центре окна и нажмите кнопку "ОК".

      Это действие делает типы, определенные в проекте GettingStartedLib , доступными для проекта GettingStartedHost .

  3. Добавьте ссылку в проект GettingStartedHost в сборкуSystem.ServiceModel:

    1. В окне Обозреватель решений выберите папку "Ссылки" в проекте GettingStartedHost и выберите пункт "Добавить ссылку" в контекстном меню.

    2. В окне "Добавить ссылку" в разделе "Сборки" в левой части окна выберите "Платформа".

    3. Выберите System.ServiceModel и нажмите кнопку "ОК".

    4. Сохраните решение, нажав кнопку "Сохранить все файлы>".

Добавление кода для размещения службы

Чтобы разместить службу, добавьте код, чтобы выполнить следующие действия:

  1. Создайте универсальный код ресурса (URI) для базового адреса.
  2. Создайте экземпляр класса для размещения службы.
  3. Создайте конечную точку службы.
  4. Включите обмен метаданными.
  5. Откройте узел службы для прослушивания входящих сообщений.

Внесите следующие изменения в код:

  1. Откройте файл Program.cs или Module1.vb в проекте GettingStartedHost и замените его код следующим кодом:

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using GettingStartedLib;
    
    namespace GettingStartedHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Step 1: Create a URI to serve as the base address.
                Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
    
                // Step 2: Create a ServiceHost instance.
                ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
                try
                {
                    // Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    
                    // Step 4: Enable metadata exchange.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    selfHost.Description.Behaviors.Add(smb);
    
                    // Step 5: Start the service.
                    selfHost.Open();
                    Console.WriteLine("The service is ready.");
    
                    // Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.");
                    Console.WriteLine();
                    Console.ReadLine();
                    selfHost.Close();
                }
                catch (CommunicationException ce)
                {
                    Console.WriteLine("An exception occurred: {0}", ce.Message);
                    selfHost.Abort();
                }
            }
        }
    }
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    Imports GettingStartedLib.GettingStartedLib
    
    Module Service
    
        Class Program
            Shared Sub Main()
                ' Step 1: Create a URI to serve as the base address.
                Dim baseAddress As New Uri("http://localhost:8000/GettingStarted/")
    
                ' Step 2: Create a ServiceHost instance.
                Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
               Try
    
                    ' Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint( _
                        GetType(ICalculator), _
                        New WSHttpBinding(), _
                        "CalculatorService")
    
                    ' Step 4: Enable metadata exchange.
                    Dim smb As New ServiceMetadataBehavior()
                    smb.HttpGetEnabled = True
                    selfHost.Description.Behaviors.Add(smb)
    
                    ' Step 5: Start the service.
                    selfHost.Open()
                    Console.WriteLine("The service is ready.")
    
                    ' Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.")
                    Console.WriteLine()
                    Console.ReadLine()
                    selfHost.Close()
    
                Catch ce As CommunicationException
                    Console.WriteLine("An exception occurred: {0}", ce.Message)
                    selfHost.Abort()
                End Try
            End Sub
        End Class
    
    End Module
    

    Сведения о том, как работает этот код, см. в шагах программы размещения службы.

  2. Обновите свойства проекта:

    1. В окне Обозреватель решений выберите папку GettingStartedHost и выберите "Свойства" в контекстном меню.

    2. На странице свойств GettingStartedHost выберите вкладку "Приложение":

      • Для проектов C# выберите "ПолучитьStartedHost.Program " в списке объектов Startup.

      • Для проектов Visual Basic выберите Service.Program из списка объектов Startup.

    3. В меню "Файл" выберите "Сохранить все".

Проверка работы службы

  1. Создайте решение и запустите консольное приложение GettingStartedHost из Visual Studio.

    Служба должна выполняться с правами администратора. Так как вы открыли Visual Studio с правами администратора, при запуске GettingStartedHost в Visual Studio приложение также выполняется с правами администратора. В качестве альтернативы можно открыть новую командную строку от имени администратора (выбрать "Больше>запуска от имени администратора" в контекстном меню) и запустить GettingStartedHost.exe в ней.

  2. Откройте веб-браузер и перейдите на страницу http://localhost:8000/GettingStarted/службы.

    Примечание.

    Таким службам требуется соответствующее разрешение на регистрацию HTTP-адресов на компьютере для прослушивания. Учетные записи с уровнем доступа администратора имеют данное разрешение, а остальным учетным записям должно быть предоставлено разрешение на использование пространства имен HTTP. Дополнительные сведения о настройке резервирования пространств имен см. в разделе Настройка протоколов HTTP и HTTPS.

Действия по программе размещения служб

Действия в коде, добавленном для размещения службы, описаны следующим образом:

  • Шаг 1. Создание экземпляра Uri класса для хранения базового адреса службы. URL-адрес, содержащий базовый адрес, имеет необязательный универсальный код ресурса (URI), определяющий службу. Базовый адрес форматируется следующим образом: <transport>://<machine-name or domain><:optional port #>/<optional URI segment> Базовый адрес для службы калькулятора использует http-транспорт, localhost, порт 8000 и сегмент URI, GettingStarted.

  • Шаг 2. Создание экземпляра ServiceHost класса, который используется для размещения службы. Конструктор принимает два параметра: тип класса, реализующего контракт службы и базовый адрес службы.

  • Шаг 3. Создание экземпляра ServiceEndpoint . Конечная точка службы состоит из адреса, привязки и контракта службы. Конструктор ServiceEndpoint состоит из типа интерфейса контракта службы, привязки и адреса. Контракт службы - ICalculator. Он определен и реализуется в типе службы. Привязка для этого примера — WSHttpBindingэто встроенная привязка и подключение к конечным точкам, которые соответствуют спецификациям WS-* . Дополнительные сведения о привязках WCF см. в обзоре привязок WCF. Добавьте адрес к базовому адресу, чтобы определить конечную точку. Код задает адрес в качестве калькулятора и полный адрес конечной точки в качестве http://localhost:8000/GettingStarted/CalculatorService.

    Внимание

    Для платформа .NET Framework версии 4 и более поздних версий добавление конечной точки службы является необязательным. Если вы не добавите код или конфигурацию, WCF добавляет одну конечную точку по умолчанию для каждого сочетания базового адреса и контракта, реализованного службой. Дополнительные сведения о конечных точках по умолчанию см. в разделе "Указание адреса конечной точки". Дополнительные сведения о конечных точках, привязках и поведении по умолчанию см. в статье "Упрощенная конфигурация" и "Упрощенная конфигурация" для служб WCF.

  • Шаг 4. Включение обмена метаданными. Клиенты используют обмен метаданными для создания прокси-серверов для вызова операций службы. Чтобы включить обмен метаданными, создайте ServiceMetadataBehavior экземпляр, задайте его HttpGetEnabled свойство trueи добавьте ServiceMetadataBehavior объект в Behaviors коллекцию экземпляра ServiceHost .

  • Шаг 5. Открытие ServiceHost для прослушивания входящих сообщений. Приложение ожидает нажатия клавиши ВВОД. После создания экземпляра ServiceHostприложения он выполняет блок try/catch. Дополнительные сведения о безопасном перехвате исключений, вызванных ServiceHost, см. в разделе "Закрыть" и "Прерывание", чтобы освободить клиентские ресурсы WCF.

Внимание

При добавлении библиотеки служб WCF Visual Studio размещает его для вас при отладке, запуская узел службы. Чтобы избежать конфликтов, вы можете запретить Visual Studio размещать библиотеку служб WCF.

  1. Выберите проект GettingStartedLib в Обозреватель решений и выберите "Свойства" в контекстном меню.
  2. Выберите параметры WCF и не проверка запустить узел службы WCF при отладке другого проекта в том же решении.

Следующие шаги

Из этого руководства вы узнали, как:

  • Создайте и настройте проект консольного приложения для размещения службы WCF.
  • Добавьте код для размещения службы WCF.
  • Обновите файл конфигурации.
  • Запустите службу WCF и убедитесь, что она запущена.

Перейдите к следующему руководству, чтобы узнать, как создать клиент WCF.