Практическое руководство. Размещение службы WCF в управляемом приложении

Для размещения службы внутри управляемого приложения внедрите код службы внутрь кода управляемого приложения, определите конечную точку для службы императивно в коде, декларативно с помощью конфигурации или посредством конечных точек по умолчанию, а затем создайте экземпляр класса ServiceHost.

Чтобы начать принимать сообщения, вызовите метод Open для ServiceHost. При этом создается и открывается прослушиватель для этой службы. Такое размещение службы часто называется "резидентным", так как управляемое приложение самостоятельно выполняет функции ведущего приложения. Чтобы закрыть службу, вызовите метод CommunicationObject.Close для ServiceHost.

Служба может также размещаться в управляемой службе Windows, в службах IIS или в службе активации процесса Windows (WAS). Дополнительные сведения о вариантах размещения службы см. в разделе "Службы размещения".

Размещение служб в управляемом приложении - самый гибкий вариант размещения, так как в этом случае требуется минимальное развертывание инфраструктуры. Дополнительные сведения о размещении служб в управляемых приложениях см. в разделе "Размещение в управляемом приложении".

В следующей процедуре показано, как реализовать резидентную службу в консольном приложения.

Создание локальной службы

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

    1. Откройте Visual Studio и выберите "Создать>проект" в меню "Файл".

    2. В списке установленных шаблонов выберите Visual C# или Visual Basic, а затем выберите "Рабочий стол Windows".

    3. Выберите шаблон консольного приложения . Введите SelfHost поле "Имя" и нажмите кнопку "ОК".

  2. Щелкните правой кнопкой мыши SelfHost в Обозреватель решений и выберите "Добавить ссылку". Выберите System.ServiceModel на вкладке .NET и нажмите кнопку "ОК".

    Совет

    Если окно Обозреватель решений не отображается, выберите Обозреватель решений в меню "Вид".

  3. Дважды щелкните Program.cs или Module1.vb в Обозреватель решений, чтобы открыть его в окне кода, если он еще не открыт. Добавьте следующие инструкции в начало файла .

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Определите и реализуйте контракт службы. В этом примере определяется служба HelloWorldService, которая возвращает сообщение на основании входных данных, передаваемых службе.

    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService
    
        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class
    

    Примечание.

    Дополнительные сведения о том, как определить и реализовать интерфейс службы, см. в разделе "Практическое руководство. Определение контракта службы и практическое руководство. Реализация контракта службы".

  5. В начале метода Main создайте экземпляр класса Uri с базовым адресом для службы.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. Создайте экземпляр класса ServiceHost, передав Type, представляющий тип службы, и универсальный код ресурса (URI) базового адреса в метод ServiceHost(Type, Uri[]). Включите публикацию метаданных и вызовите метод Open в ServiceHost, чтобы инициализировать службу и подготовить ее к приему сообщений.

    // Create the ServiceHost.
    using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);
    
        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        host.Open();
    
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
    
        // Close the ServiceHost.
        host.Close();
    }
    
    ' Create the ServiceHost.
    Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
    
        ' Enable metadata publishing.
        Dim smb As New ServiceMetadataBehavior()
        smb.HttpGetEnabled = True
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
        host.Description.Behaviors.Add(smb)
    
        ' Open the ServiceHost to start listening for messages. Since
        ' no endpoints are explicitly configured, the runtime will create
        ' one endpoint per base address for each service contract implemented
        ' by the service.
        host.Open()
    
        Console.WriteLine("The service is ready at {0}", baseAddress)
        Console.WriteLine("Press <Enter> to stop the service.")
        Console.ReadLine()
    
        ' Close the ServiceHost.
        host.Close()
    
    End Using
    

    Примечание.

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

  7. Нажмите клавиши CTRL+SHIFT+B, чтобы создать решение.

Тестирование службы

  1. Нажмите клавиши CTRL+F5, чтобы запустить службу.

  2. Откройте тестовый клиент WCF.

    Совет

    Чтобы открыть тестовый клиент WCF, откройте командную строку разработчика для Visual Studio и выполните WcfTestClient.exe.

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

  4. Введите http://localhost:8080/hello в адресное поле и нажмите кнопку "ОК".

    Совет

    Убедитесь, что служба запущена. В противном случае проверка дает отрицательный результат на этом этапе. Если базовый адрес в коде был изменен, используйте на этом этапе измененный базовый адрес.

  5. Дважды щелкните SayHello в узле "Мои проекты служб". Введите имя в столбец "Значение " в списке запросов и нажмите кнопку "Вызвать".

    В списке ответов появится сообщение ответа .

Пример

В следующем примере создается объект ServiceHost для размещения службы типа HelloWorldService, затем вызывается метод Open для ServiceHost. Базовый адрес предоставляется в коде, включена публикация метаданных и используются конечные точки по умолчанию.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace SelfHost
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8080/hello");

            // Create the ServiceHost.
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                // Enable metadata publishing.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                // Open the ServiceHost to start listening for messages. Since
                // no endpoints are explicitly configured, the runtime will create
                // one endpoint per base address for each service contract implemented
                // by the service.
                host.Open();

                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();

                // Close the ServiceHost.
                host.Close();
            }
        }
    }
}
Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Module1

    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface

    Public Class HelloWorldService
        Implements IHelloWorldService

        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class

    Sub Main()
        Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")

        ' Create the ServiceHost.
        Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)

            ' Enable metadata publishing.
            Dim smb As New ServiceMetadataBehavior()
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            host.Description.Behaviors.Add(smb)

            ' Open the ServiceHost to start listening for messages. Since
            ' no endpoints are explicitly configured, the runtime will create
            ' one endpoint per base address for each service contract implemented
            ' by the service.
            host.Open()

            Console.WriteLine("The service is ready at {0}", baseAddress)
            Console.WriteLine("Press <Enter> to stop the service.")
            Console.ReadLine()

            ' Close the ServiceHost.
            host.Close()

        End Using

    End Sub

End Module

См. также