Практическое руководство. Размещение службы WCF в управляемом приложенииHow to: Host a WCF service in a managed app

Для размещения службы внутри управляемого приложения внедрите код службы внутрь кода управляемого приложения, определите конечную точку для службы императивно в коде, декларативно с помощью конфигурации или посредством конечных точек по умолчанию, а затем создайте экземпляр класса ServiceHost.To host a service inside a managed application, embed the code for the service inside the managed application code, define an endpoint for the service either imperatively in code, declaratively through configuration, or using default endpoints, and then create an instance of ServiceHost.

Чтобы начать принимать сообщения, вызовите метод Open для ServiceHost.To start receiving messages, call Open on ServiceHost. При этом создается и открывается прослушиватель для этой службы.This creates and opens the listener for the service. Такое размещение службы часто называется "резидентным", так как управляемое приложение самостоятельно выполняет функции ведущего приложения.Hosting a service in this way is often referred to as "self-hosting" because the managed application is doing the hosting work itself. Чтобы закрыть службу, вызовите метод CommunicationObject.Close для ServiceHost.To close the service, call CommunicationObject.Close on ServiceHost.

Служба может также размещаться в управляемой службе Windows, в службах IIS или в службе активации процесса Windows (WAS).A service can also be hosted in a managed Windows service, in Internet Information Services (IIS), or in Windows Process Activation Service (WAS). Дополнительные сведения о вариантах службы размещения, см. в разделе размещение служб.For more information about hosting options for a service, see Hosting Services.

Размещение служб в управляемом приложении - самый гибкий вариант размещения, так как в этом случае требуется минимальное развертывание инфраструктуры.Hosting a service in a managed application is the most flexible option because it requires the least infrastructure to deploy. Дополнительные сведения о размещении службы в управляемых приложениях см. в разделе размещение в приложении управляемых.For more information about hosting services in managed applications, see Hosting in a Managed Application.

В следующей процедуре показано, как реализовать резидентную службу в консольном приложения.The following procedure demonstrates how to implement a self-hosted service in a console application.

Создание резидентной службыCreate a self-hosted service

  1. Создайте новое консольное приложение.Create a new console application:

    1. Откройте Visual Studio и выберите New > проекта из файл меню.Open Visual Studio and select New > Project from the File menu.

    2. В установленные шаблоны выберите Visual C# или Visual Basic, а затем выберите Windows Desktop.In the Installed Templates list, select Visual C# or Visual Basic, and then select Windows Desktop.

    3. Выберите консольное приложение шаблона.Select the Console App template. Тип SelfHost в имя поле, а затем выберите ОК.Type SelfHost in the Name box and then choose OK.

  2. Щелкните правой кнопкой мыши SelfHost в обозревателе решений и выберите добавить ссылку.Right-click SelfHost in Solution Explorer and select Add Reference. Выберите System.ServiceModel из .NET вкладку ОК.Select System.ServiceModel from the .NET tab and then choose OK.

    Совет

    Если обозревателе решений окно не отображается, выберите пункт обозревателе решений из представление меню.If the Solution Explorer window is not visible, select Solution Explorer from the View menu.

  3. Дважды щелкните Program.cs или Module1.vb в обозревателе решений чтобы открыть его в окне кода, если он еще не открыт.Double-click Program.cs or Module1.vb in Solution Explorer to open it in the code window, if it's not already open. Добавьте следующие инструкции в начало файла:Add the following statements at the top of the file:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Определите и реализуйте контракт службы.Define and implement a service contract. В этом примере определяется служба HelloWorldService, которая возвращает сообщение на основании входных данных, передаваемых службе.This example defines a HelloWorldService that returns a message based on the input to the service.

    [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
    

    Примечание

    Дополнительные сведения о том, как определить и реализовать интерфейс службы см. в разделе как: Определите контракт службы и как: Реализация контракта службы.For more information about how to define and implement a service interface, see How to: Define a Service Contract and How to: Implement a Service Contract.

  5. В начале метода Main создайте экземпляр класса Uri с базовым адресом для службы.At the top of the Main method, create an instance of the Uri class with the base address for the service.

    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[]).Create an instance of the ServiceHost class, passing a Type that represents the service type and the base address Uniform Resource Identifier (URI) to the ServiceHost(Type, Uri[]). Включите публикацию метаданных и вызовите метод Open в ServiceHost, чтобы инициализировать службу и подготовить ее к приему сообщений.Enable metadata publishing, and then call the Open method on the ServiceHost to initialize the service and prepare it to receive messages.

    // 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
    

    Примечание

    В этом примере используются конечные точки по умолчанию, и для данной службы не требуется файл конфигурации.This example uses default endpoints, and no configuration file is required for this service. Если конечные точки не настроены, то среда выполнения создает одну конечную точку для каждого базового адреса в каждом контракте службы, реализованном в службе.If no endpoints are configured, then the runtime creates one endpoint for each base address for each service contract implemented by the service. Дополнительные сведения о конечных точках по умолчанию, см. в разделе Simplified Configuration и Simplified Configuration for WCF Services.For more information about default endpoints, see Simplified Configuration and Simplified Configuration for WCF Services.

  7. Нажмите клавишу Ctrl+Shift+B для сборки решения.Press Ctrl+Shift+B to build the solution.

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

  1. Нажмите клавишу Ctrl+F5 для запуска службы.Press Ctrl+F5 to run the service.

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

    Совет

    Чтобы открыть тестовый клиент WCF, откройте командную строку разработчика для Visual Studio и выполнение WcfTestClient.exe.To open WCF Test Client, open Developer Command Prompt for Visual Studio and execute WcfTestClient.exe.

  3. Выберите добавить службу из файл меню.Select Add Service from the File menu.

  4. Тип http://localhost:8080/hello в поле "адрес" и нажмите кнопку ОК.Type http://localhost:8080/hello into the address box and click OK.

    Совет

    Убедитесь, что служба запущена. В противном случае проверка дает отрицательный результат на этом этапе.Make sure the service is running or else this step fails. Если базовый адрес в коде был изменен, используйте на этом этапе измененный базовый адрес.If you have changed the base address in the code, then use the modified base address in this step.

  5. Дважды щелкните SayHello под Мои проекты служб узла.Double-click SayHello under the My Service Projects node. Введите имя в значение столбца в запроса списке и нажмите кнопку Invoke.Type your name into the Value column in the Request list, and click Invoke.

    Появится ответное сообщение в ответа списка.A reply message appears in the Response list.

ПримерExample

В следующем примере создается объект ServiceHost для размещения службы типа HelloWorldService, затем вызывается метод Open для ServiceHost.The following example creates a ServiceHost object to host a service of type HelloWorldService, and then calls the Open method on ServiceHost. Базовый адрес предоставляется в коде, включена публикация метаданных и используются конечные точки по умолчанию.A base address is provided in code, metadata publishing is enabled, and default endpoints are used.

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

См. такжеSee also