Udostępnij za pośrednictwem


Standardowe punkty końcowe

Punkty końcowe są definiowane przez określenie adresu, powiązania i kontraktu. Inne parametry, które można ustawić w punkcie końcowym, obejmują konfigurację zachowania, nagłówki i identyfikatory URI nasłuchiwania. W przypadku niektórych typów punktów końcowych te wartości nie zmieniają się. Na przykład punkty końcowe wymiany metadanych zawsze używają kontraktu IMetadataExchange . Inne punkty końcowe, takie jak WebHttpEndpoint zawsze wymagają określonego zachowania punktu końcowego. Użyteczność punktu końcowego można poprawić, mając punkty końcowe z wartościami domyślnymi dla często używanych właściwości punktu końcowego. Standardowe punkty końcowe umożliwiają deweloperowi zdefiniowanie punktu końcowego zawierającego wartości domyślne lub miejsce, w którym właściwości co najmniej jednego punktu końcowego nie ulegają zmianie. Te punkty końcowe umożliwiają korzystanie z takiego punktu końcowego bez konieczności określania informacji o charakterze statycznym. Standardowe punkty końcowe mogą służyć do obsługi punktów końcowych infrastruktury i aplikacji.

Punkty końcowe infrastruktury

Usługa może uwidaczniać punkty końcowe z niektórymi właściwościami, które nie zostały jawnie zaimplementowane przez autora usługi. Na przykład punkt końcowy wymiany metadanych uwidacznia IMetadataExchange kontrakt, ale jako autor usługi nie implementujesz tego interfejsu, jest implementowany przez usługę WCF. Takie punkty końcowe infrastruktury mają wartości domyślne dla co najmniej jednej właściwości punktu końcowego, z których niektóre mogą być nie do pomyślenia. Właściwość Contract punktu końcowego wymiany metadanych musi mieć IMetadataExchangewartość , a inne właściwości, takie jak powiązanie, mogą być dostarczane przez dewelopera. Punkty końcowe infrastruktury są identyfikowane przez ustawienie IsSystemEndpoint właściwości na true.

Punkty końcowe aplikacji

Deweloperzy aplikacji mogą definiować własne standardowe punkty końcowe, które określają wartości domyślne adresu, powiązania lub kontraktu. Należy zdefiniować standardowy punkt końcowy, wyprowadzając klasę z ServiceEndpoint klasy i ustawiając odpowiednie właściwości punktu końcowego. Możesz podać wartości domyślne właściwości, które można zmienić. Niektóre inne właściwości będą miały wartości statyczne, których nie można zmienić. W poniższym przykładzie pokazano, jak zaimplementować standardowy punkt końcowy.

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; }
}

Aby użyć niestandardowego punktu końcowego zdefiniowanego przez użytkownika w pliku konfiguracji, należy utworzyć klasę StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration>z StandardEndpointElementklasy , a następnie zarejestrować nowy standardowy punkt końcowy w sekcji rozszerzeń w pliku app.config lub machine.config. Zapewnia StandardEndpointElement obsługę konfiguracji standardowego punktu końcowego, jak pokazano w poniższym przykładzie.

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)
    {
    }
}

Element StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> udostępnia typ kopii zapasowej kolekcji, która jest <standardEndpoints> wyświetlana w sekcji w konfiguracji standardowego punktu końcowego. W poniższym przykładzie pokazano, jak zaimplementować tę klasę.

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

W poniższym przykładzie pokazano, jak zarejestrować standardowy punkt końcowy w sekcji rozszerzeń.

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

Konfigurowanie standardowego punktu końcowego

Standardowe punkty końcowe można dodawać w kodzie lub w konfiguracji. Aby dodać standardowy punkt końcowy w kodzie, wystarczy utworzyć wystąpienie odpowiedniego standardowego typu punktu końcowego i dodać go do hosta usługi, jak pokazano w poniższym przykładzie:

serviceHost.AddServiceEndpoint(new CustomEndpoint());

Aby dodać standardowy punkt końcowy w konfiguracji, dodaj <endpoint> element do <service> elementu i wszystkie wymagane ustawienia konfiguracji w elemecie <standardEndpoints> . W poniższym przykładzie pokazano, jak dodać UdpDiscoveryEndpointjeden ze standardowych punktów końcowych dostarczanych z programem .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>

Typ standardowego punktu końcowego jest określony przy użyciu atrybutu kind w elemecie <endpoint> . Punkt końcowy jest konfigurowany w elemecie <standardEndpoints> . W powyższym UdpDiscoveryEndpoint przykładzie punkt końcowy jest dodawany i konfigurowany. Element <udpDiscoveryEndpoint> zawiera element <standardEndpoint> , który ustawia MulticastAddress właściwość UdpDiscoveryEndpoint.

Standardowe punkty końcowe dostarczane z programem .NET Framework

W poniższej tabeli wymieniono standardowe punkty końcowe dostarczane z programem .NET Framework 4.6.1.

Mex Endpoint Standardowy punkt końcowy używany do uwidaczniania metadanych usługi.

AnnouncementEndpoint Standardowy punkt końcowy używany przez usługi do wysyłania komunikatów o anonsach.

DiscoveryEndpoint Standardowy punkt końcowy używany przez usługi do wysyłania komunikatów odnajdywania.

UdpDiscoveryEndpoint Standardowy punkt końcowy, który jest wstępnie skonfigurowany do operacji odnajdywania za pośrednictwem powiązania multiemisji UDP.

UdpAnnouncementEndpoint Standardowy punkt końcowy używany przez usługi do wysyłania komunikatów o anonsach za pośrednictwem powiązania UDP.

DynamicEndpoint Standardowy punkt końcowy korzystający z odnajdywania WS do dynamicznego znajdowania adresu punktu końcowego w czasie wykonywania.

ServiceMetadataEndpoint Standardowy punkt końcowy wymiany metadanych.

WebHttpEndpoint Standardowy punkt końcowy z powiązaniem WebHttpBinding , które automatycznie dodaje WebHttpBehavior zachowanie

WebScriptEndpoint Standardowy punkt końcowy z powiązaniem WebHttpBinding , które automatycznie dodaje WebScriptEnablingBehavior zachowanie.

WebServiceEndpoint Standardowy punkt końcowy z powiązaniem WebHttpBinding .

WorkflowControlEndpoint Standardowy punkt końcowy, który umożliwia wywoływanie operacji kontroli w wystąpieniach przepływu pracy.

WorkflowHostingEndpoint Standardowy punkt końcowy obsługujący tworzenie przepływu pracy i ponowne tworzenie zakładek.