Как разместить службу 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 и выберите в меню файл пункт создать проект > .Open Visual Studio and select New > Project from the File menu.

    2. В списке Установленные шаблоны выберите элемент визуальный C# или Visual Basic, а затем выберите Рабочий стол Windows.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. Щелкните правой кнопкой мыши резидент в Обозреватель решений и выберите команду Добавить ссылку.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. Дополнительные сведения о конечных точках по умолчанию см. в разделе упрощенная конфигурация и упрощенная конфигурация для служб WCF.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. Введите свое имя в столбец значение в списке запрос и нажмите кнопку вызвать.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