Standardní koncové body
Koncové body jsou definovány zadáním adresy, vazby a kontraktu. Mezi další parametry, které můžou být nastavené na koncovém bodu, patří konfigurace chování, hlavičky a identifikátory URI naslouchání. U určitých typů koncových bodů se tyto hodnoty nemění. Koncové body výměny metadat například vždy používají IMetadataExchange kontrakt. Jiné koncové body, například WebHttpEndpoint vždy vyžadují zadané chování koncového bodu. Použitelnost koncového bodu je možné vylepšit díky tomu, že mají koncové body s výchozími hodnotami pro běžně používané vlastnosti koncového bodu. Standardní koncové body umožňují vývojáři definovat koncový bod, který má výchozí hodnoty nebo kde se nemění vlastnosti jednoho nebo více koncových bodů. Tyto koncové body umožňují použít takový koncový bod, aniž byste museli zadávat informace o statické povaze. Standardní koncové body je možné použít pro koncové body infrastruktury a aplikací.
Koncové body infrastruktury
Služba může zveřejnit koncové body s některými vlastnostmi, které autor služby explicitně neimplementuje. Koncový bod výměny metadat například zpřístupňuje IMetadataExchange kontrakt, ale jako autor služby, které neimplementujete, implementuje ho WCF. Tyto koncové body infrastruktury mají výchozí hodnoty pro jednu nebo více vlastností koncového bodu, z nichž některé můžou být nealterovatelné. Vlastnost Contract koncového bodu výměny metadat musí být IMetadataExchange, zatímco vývojář může zadat další vlastnosti, jako je vazba. Koncové body infrastruktury se identifikují nastavením IsSystemEndpoint vlastnosti na true
hodnotu .
Koncové body aplikace
Vývojáři aplikací můžou definovat vlastní standardní koncové body, které určují výchozí hodnoty pro adresu, vazbu nebo kontrakt. Standardní koncový bod definujete odvozením třídy a ServiceEndpoint nastavením odpovídajících vlastností koncového bodu. Můžete zadat výchozí hodnoty vlastností, které je možné změnit. Některé další vlastnosti budou mít statické hodnoty, které se nedají změnit. Následující příklad ukazuje, jak implementovat standardní koncový bod.
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; }
}
Chcete-li použít vlastní koncový bod definovaný uživatelem v konfiguračním souboru, musíte odvodit třídu z StandardEndpointElement, odvodit třídu od StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration>a zaregistrovat nový standardní koncový bod v části rozšíření v souboru app.config nebo machine.config. Poskytuje StandardEndpointElement podporu konfigurace pro standardní koncový bod, jak je znázorněno v následujícím příkladu.
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)
{
}
}
Poskytuje StandardEndpointCollectionElement<TStandardEndpoint,TEndpointConfiguration> záložní typ kolekce, která se zobrazí v <standardEndpoints>
části v konfiguraci standardního koncového bodu. Následující příklad ukazuje, jak implementovat tuto třídu.
public class CustomEndpointCollectionElement : StandardEndpointCollectionElement<CustomEndpoint, CustomEndpointElement>
{
// ...
}
Následující příklad ukazuje, jak zaregistrovat standardní koncový bod v části rozšíření.
<extensions>
<standardEndpointExtensions>
<add
name="customStandardEndpoint"
type="CustomEndpointCollectionElement, Example.dll,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=ffffffffffffffff"/>
</standardEndpointExtensions>
</extensions>
Konfigurace standardního koncového bodu
Standardní koncové body je možné přidat v kódu nebo v konfiguraci. Pokud chcete do kódu přidat standardní koncový bod, jednoduše vytvořte instanci příslušného standardního typu koncového bodu a přidejte ho do hostitele služby, jak je znázorněno v následujícím příkladu:
serviceHost.AddServiceEndpoint(new CustomEndpoint());
Pokud chcete přidat standardní koncový bod v konfiguraci, přidejte <endpoint>
do elementu <service>
prvek a veškerá potřebná nastavení konfigurace v elementu <standardEndpoints>
. Následující příklad ukazuje, jak přidat UdpDiscoveryEndpointjeden ze standardních koncových bodů, které jsou dodávány s rozhraním .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 standardního koncového bodu je určen pomocí atributu kind v elementu <endpoint>
. Koncový bod je nakonfigurovaný v rámci elementu <standardEndpoints>
. V předchozím příkladu UdpDiscoveryEndpoint se přidá a nakonfiguruje koncový bod. Prvek <udpDiscoveryEndpoint>
obsahuje, <standardEndpoint>
který nastaví MulticastAddress vlastnost UdpDiscoveryEndpoint.
Standardní koncové body dodávané s rozhraním .NET Framework
Následující tabulka uvádí standardní koncové body dodávané s rozhraním .NET Framework 4.6.1.
Mex Endpoint
Standardní koncový bod, který se používá k zveřejnění metadat služby.
AnnouncementEndpoint Standardní koncový bod používaný službami k odesílání zpráv oznámení.
DiscoveryEndpoint Standardní koncový bod používaný službami k odesílání zpráv zjišťování.
UdpDiscoveryEndpoint Standardní koncový bod, který je předem nakonfigurovaný pro operace zjišťování přes vazbu vícesměrového vysílání UDP.
UdpAnnouncementEndpoint Standardní koncový bod používaný službami k odesílání zpráv oznámení přes vazbu UDP.
DynamicEndpoint Standardní koncový bod, který používá WS-Discovery k dynamickému vyhledání adresy koncového bodu za běhu.
ServiceMetadataEndpoint Standardní koncový bod pro výměnu metadat.
WebHttpEndpoint Standardní koncový bod s vazbou WebHttpBinding , která automaticky přidává WebHttpBehavior chování
WebScriptEndpoint Standardní koncový bod s vazbou WebHttpBinding , která chování automaticky přidá WebScriptEnablingBehavior .
WebServiceEndpoint Standardní koncový bod s vazbou WebHttpBinding .
WorkflowControlEndpoint Standardní koncový bod, který umožňuje volat operace řízení u instancí pracovního postupu.
WorkflowHostingEndpoint Standardní koncový bod, který podporuje vytvoření pracovního postupu a obnovení záložky.