Обзор создания конечной точки

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

Структура конечной точки

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

  • Адрес. Адрес однозначно определяет конечную точку и сообщает потенциальным потребителям, где находится служба. Он представлен в объектной модели WCF адресом EndpointAddress , который содержит универсальный идентификатор ресурса (URI) и свойства адреса, включающие удостоверение, некоторые элементы языка описания веб-служб (WSDL) и коллекцию необязательных заголовков. Необязательные заголовки предоставляют дополнительные подробные сведения об адресации для идентификации или взаимодействия с конечной точкой. Дополнительные сведения см. в разделе "Указание адреса конечной точки".

  • Привязка. Привязка указывает, как взаимодействовать с конечной точкой. Привязка указывает, как конечная точка взаимодействует с миром, включая используемый транспортный протокол (например, TCP или HTTP), который кодирует сообщения (например, текст или двоичный), а также какие требования безопасности необходимы (например, протокол SSL) или безопасность сообщений SOAP. Дополнительные сведения см. в разделе "Использование привязок для настройки служб и клиентов".

  • Контракт службы. Контракт службы описывает, какие функции предоставляет конечная точка клиенту. Контракт указывает операции, которые клиент может вызывать, форму сообщения и тип входных параметров или данных, необходимых для вызова операции, и тип обработки или ответа, которое может ожидать клиент. Три основных типа контрактов соответствуют основным шаблонам обмена сообщениями (MEPs): диаграмма данных (односторонняя), запрос/ответ и дуплексная (двунаправленная). Контракт обслуживания может также использовать контракты данных и сообщений для того, чтобы при доступе требовать определенные типы данных и форматы сообщений. Дополнительные сведения о том, как определить контракт службы, см. в разделе "Проектирование контрактов службы". Обратите внимание, что клиенту также может потребоваться реализовать контракт, определенный службой и называемый контрактом обратного вызова, чтобы получать сообщения от службы в режиме дуплексного обмена сообщениями. Дополнительные сведения см. в разделе "Дуплексные службы".

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

Замечание

При добавлении конечной точки службы, выполняющей олицетворение, необходимо использовать или метод AddServiceEndpoint, или один из методов GetContract(Type, Type), чтобы правильно загрузить контракт в новый объект ServiceDescription.

Определение конечных точек в коде

В следующем примере показано, как указать конечную точку в коде следующим образом:

  • Определите контракт для IEcho типа службы, которая принимает чьё-то имя и отвечает со следующим: "Привет, <имя>!".

  • Echo Реализуйте службу типа, определенного контрактомIEcho.

  • Укажите адрес конечной точки http://localhost:8000/Echo для службы.

  • Настройте службу Echo с помощью привязки WSHttpBinding.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Use a predefined WSHttpBinding to configure the service.
          WSHttpBinding binding = new WSHttpBinding();

          // Add the endpoint for this service to the service host.
          serviceHost.AddServiceEndpoint(
             typeof(IEcho),
             binding,
             echoUri
           );

          // Open the service host to run it.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)

' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()

' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)

' Open the service host to run it.
serviceHost.Open()

Замечание

Узел службы создается с базовым адресом, а остальная часть адреса относительно базового адреса указывается как часть конечной точки. Это секционирование адреса позволяет определить несколько конечных точек более удобно для служб на узле.

Замечание

Свойства в приложении-службе ServiceDescription не должны быть изменены после вызова метода OnOpening на ServiceHostBase. Некоторые члены, такие как свойство Credentials и методы AddServiceEndpoint на ServiceHostBase и ServiceHost, вызывают исключение, если они изменены после этой точки. Другие позволяют изменять их, но результат не определен.

На клиенте аналогичным образом, значения ServiceEndpoint не должны быть изменены после вызова OnOpening в ChannelFactory. Свойство Credentials вызывает исключение, если оно изменено после этой точки. Другие значения описания клиента можно изменить без ошибок, но результат не определен.

Рекомендуется изменить описание для службы или для клиента перед вызовом Open.

Определение конечных точек в конфигурации

При создании приложения часто требуется передать ответственность за принятие решений администратору, который развертывает приложение. Например, часто нет способа заранее знать, какой адрес службы (URI) будет. Вместо жесткого написания адреса предпочтительнее разрешить администратору сделать это после создания службы. Эта гибкость достигается с помощью конфигурации. Дополнительные сведения см. в разделе "Настройка служб".

Замечание

Используйте утилиту для работы с метаданными ServiceModel (Svcutil.exe) с переключателем /config:имя_файла[,имя_файла], чтобы быстро создать файлы конфигурации.

Использование конечных точек по умолчанию

Если конечные точки не указаны в коде или конфигурации, среда выполнения предоставляет конечные точки по умолчанию, добавив одну конечную точку по умолчанию для каждого базового адреса для каждого контракта службы, реализованного службой. Базовый адрес можно указать в коде или конфигурации, а конечные точки по умолчанию добавляются, когда вызывается Open() на ServiceHost. Этот пример является тем же примером из предыдущего раздела, но так как конечные точки не указаны, добавляются конечные точки по умолчанию.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   public class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Open the service host to run it. Default endpoints
          // are added when the service is opened.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()

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

См. также