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


Стандартные конечные точки

Конечные точки определяются адресом, привязкой и контрактом. Кроме того, для конечной точки можно задать и другие параметры - конфигурацию поведения, заголовки и URI прослушивания. Эти значения не изменяются для определенных типов конечных точек. Например, конечные точки обмена метаданными всегда используют контракт IMetadataExchange. Другим конечным точкам, например WebHttpEndpoint, всегда требуется определенное поведение конечной точки. Конечную точку можно сделать более удобной для использования, определив значения по умолчанию для часто используемых свойств. Стандартные конечные точки дают разработчику возможность определить значения свойств по умолчанию, а также создавать конечные точки, где одно или несколько свойств не изменяются. Это позволяет не указывать данные статического характера. Стандартная конечная точка может использоваться в качестве конечной точки инфраструктуры и приложения.

Конечные точки инфраструктуры

Служба может включать конечные точки, некоторые из свойств которых реализованы автором службы неявным образом. Например, конечная точка обмена метаданными обеспечивает доступ по контракту IMetadataExchange, однако автору службы не обязательно реализовывать этот интерфейс, он будет реализован WCF. Такие конечные точки инфраструктуры имеют значения по умолчанию для одного или более свойств, некоторые из которых могут быть неизменяемыми. Свойство Contract конечной точки обмена метаданными должно быть реализацией интерфейса IMetadataExchange, в то время как другие свойства, например привязка, могут быть определены разработчиком. Конечные точки инфраструктуры определяются установкой свойства IsSystemEndpoint в значение true.

Конечные точки приложения

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

public class CustomEndpoint : ServiceEndpoint
{
    public CustomEndpoint()
        : this(string.Empty)
    { }

    public CustomEndpoint(string address)
        : this(address, ContractDescription.GetContract(typeof(ICalculator)))
    { }

    // Create the custom endpoint with a fixed binding
    public CustomEndpoint(string address, ContractDescription contract)
        : base(contract)
    {
        this.Binding = new BasicHttpBinding();
        this.IsSystemEndpoint = false;
    }

    // Definition of the additional property of this endpoint
    public bool Property { get; set; }
}

Чтобы использовать определяемую пользователем пользовательскую конечную точку в файле конфигурации, необходимо наследовать класс, наследовать класс от StandardEndpointElementStandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration>и зарегистрировать новую стандартную конечную точку в разделе расширений в app.config или machine.config. Предоставляет StandardEndpointElement поддержку конфигурации стандартной конечной точки, как показано в следующем примере.

public class CustomEndpointElement : StandardEndpointElement
{
    // Definition of the additional property for the standard endpoint element
    public bool Property
    {
        get { return (bool)base["property"]; }
        set { base["property"] = value; }
    }

    // The additional property needs to be added to the properties of the standard endpoint element
    protected override ConfigurationPropertyCollection Properties
    {
        get
        {
            ConfigurationPropertyCollection properties = base.Properties;
            properties.Add(new ConfigurationProperty("property", typeof(bool), false, ConfigurationPropertyOptions.None));
            return properties;
        }
    }

    // Return the type of this standard endpoint
    protected override Type EndpointType
    {
        get { return typeof(CustomEndpoint); }
    }

    // Create the custom service endpoint
    protected override ServiceEndpoint CreateServiceEndpoint(ContractDescription contract)
    {
        return new CustomEndpoint();
    }

    // Read the value given to the property in config and save it
    protected override void OnApplyConfiguration(ServiceEndpoint endpoint, ServiceEndpointElement serviceEndpointElement)
    {
        CustomEndpoint customEndpoint = (CustomEndpoint)endpoint;
        customEndpoint.Property = this.Property;
    }

    // Read the value given to the property in config and save it
    protected override void OnApplyConfiguration(ServiceEndpoint endpoint, ChannelEndpointElement channelEndpointElement)
    {
        CustomEndpoint customEndpoint = (CustomEndpoint)endpoint;
        customEndpoint.Property = this.Property;
    }

    // No validation in this sample
    protected override void OnInitializeAndValidate(ServiceEndpointElement serviceEndpointElement)
    {
    }

    // No validation in this sample
    protected override void OnInitializeAndValidate(ChannelEndpointElement channelEndpointElement)
    {
    }
}

Предоставляет StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> тип резервного копирования для коллекции, которая отображается <standardEndpoints> в разделе конфигурации стандартной конечной точки. В следующем примере показана реализация этого класса.

public class CustomEndpointCollectionElement : StandardEndpointCollectionElement<CustomEndpoint, CustomEndpointElement>
{
    // ...
}

В следующем примере показана регистрация стандартной конечной точки в разделе расширений.

<extensions>
      <standardEndpointExtensions>
        <add
          name="customStandardEndpoint"
          type="CustomEndpointCollectionElement, Example.dll,
                Version=1.0.0.0, Culture=neutral, PublicKeyToken=ffffffffffffffff"/>
      </standardEndpointExtensions>
</extensions>

Настройка стандартной конечной точки

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

serviceHost.AddServiceEndpoint(new CustomEndpoint());

Чтобы добавить стандартную конечную точку в конфигурацию, добавьте <endpoint> элемент в элемент <service> и все необходимые параметры конфигурации в элементе <standardEndpoints> . В следующем примере показано, как добавить UdpDiscoveryEndpointодну из стандартных конечных точек, которые поставляется с платформа .NET Framework 4.6.1.

<services>
  <service>
    <endpoint isSystemEndpoint="true" kind="udpDiscoveryEndpoint" />
  </service>
</services>
<standardEndpoints>
  <udpDiscoveryEndpoint>
     <standardEndpoint multicastAddress="soap.udp://239.255.255.250:3702" />
  </udpDiscoveryEndpoint>
</standardEndpoints>

Тип стандартной конечной точки указывается с помощью атрибута kind в элементе <endpoint> . Конечная точка настраивается в элементе <standardEndpoints> . В приведенном выше примере добавляется и настраивается конечная точка UdpDiscoveryEndpoint. Элемент <udpDiscoveryEndpoint> содержит объект <standardEndpoint> , который задает MulticastAddress свойство UdpDiscoveryEndpointобъекта .

Стандартные конечные точки, поставляемые в составе платформы .NET Framework

В следующей таблице перечислены стандартные конечные точки, поставляемые с платформа .NET Framework 4.6.1.

Mex Endpoint Стандартная конечная точка, используемая для предоставления метаданных службы.

AnnouncementEndpoint Стандартная конечная точка, используемая службами для отправки сообщений объявлений.

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

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

UdpAnnouncementEndpoint Стандартная конечная точка, используемая службами для отправки сообщений объявлений через привязку UDP.

DynamicEndpoint Стандартная конечная точка, использующая WS-Discovery для динамического поиска адреса конечной точки во время выполнения.

ServiceMetadataEndpoint Стандартная конечная точка для обмена метаданными.

WebHttpEndpoint Стандартная конечная точка с привязкой WebHttpBinding , которая автоматически добавляет WebHttpBehavior поведение

WebScriptEndpoint Стандартная конечная точка с привязкой WebHttpBinding , которая автоматически добавляет WebScriptEnablingBehavior поведение.

WebServiceEndpoint Стандартная конечная точка с привязкой WebHttpBinding .

WorkflowControlEndpoint Стандартная конечная точка, которая позволяет вызывать операции управления в экземплярах рабочих процессов.

WorkflowHostingEndpoint Стандартная конечная точка, поддерживающая создание рабочих процессов и возобновление закладок.