Поделиться через


Как разместить службу WCF в управляемом приложении

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

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

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

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

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

Создание резидентной службы

  1. Откройте среду Visual Studio 2010 и в меню Файл выберите пункт Создать, а затем выберите пункт Проект.

  2. В списке Установленные шаблоны выберите пункты Visual C#, Windows или Visual Basic, Windows. В зависимости от параметров Visual Studio 2010 в узле Другие языки в списке Установленные шаблоны может присутствовать один из этих языков или оба языка.

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

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

    ms731758.Tip(ru-ru,VS.100).gifСовет.
    Если окно Обозреватель решений не отображается, в меню Вид выберите пункт Обозреватель решений.

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

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

    <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
    
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    ms731758.note(ru-ru,VS.100).gifПримечание
    Дополнительные сведения об определении и реализации интерфейса службы см. в разделах Как определить контракт службы Windows Communication Foundation и Как реализовать контракт службы Windows Communication Foundation.

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

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

    ' 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
    
    // 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();
    }
    
    ms731758.note(ru-ru,VS.100).gifПримечание
    В этом примере используются конечные точки по умолчанию, и для данной службы не требуется файл конфигурации. Если конечные точки не настроены, то среда выполнения создает одну конечную точку для каждого базового адреса в каждом контракте службы, реализованном в службе. Дополнительные сведения о конечных точках по умолчанию см. в разделах Упрощенная конфигурация и Упрощенная конфигурация служб WCF.

  9. Чтобы построить решение, нажмите CTRL+SHIFT+B.

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

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

  2. Откройте окно WCF Test Client.

    ms731758.Tip(ru-ru,VS.100).gifСовет.
    Чтобы открыть окно WCF Test Client, откройте командную строку Visual Studio 2010 и выполните команду WcfTestClient.exe.

  3. Выберите команду Add Service из меню File.

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

    ms731758.Tip(ru-ru,VS.100).gifСовет.
    Убедитесь, что служба запущена. В противном случае проверка дает отрицательный результат на этом этапе. Если базовый адрес в коде был изменен, используйте на этом этапе измененный базовый адрес.

  5. Дважды щелкните элемент SayHello в узле My Service Projects. Введите имя в столбце Value в списке Request и нажмите кнопку Invoke. В списке Response появится ответное сообщение.

Пример

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

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("https://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
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("https://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();
            }
        }
    }
}

См. также

Задачи

Как разместить службу WCF в IIS
Резидентное размещение
Как определить контракт службы Windows Communication Foundation
Как реализовать контракт службы Windows Communication Foundation

Справочник

Uri
AppSettings
ConfigurationManager

Основные понятия

Размещение служб
Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe)
Использование привязок для настройки служб и клиентов
Привязки, предоставляемые системой