IServiceBehavior Interface
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Biedt een mechanisme voor het wijzigen of invoegen van aangepaste extensies in een hele service, inclusief de ServiceHostBase.
public interface class IServiceBehavior
public interface IServiceBehavior
type IServiceBehavior = interface
Public Interface IServiceBehavior
- Afgeleid
Voorbeelden
In het volgende codevoorbeeld ziet u het gebruik van een servicegedrag dat is opgegeven in een configuratiebestand om een aangepaste fouthandler in te voegen in een servicetoepassing. In dit voorbeeld worden alle uitzonderingen door de fouthandler onderschept en geconverteerd naar een aangepaste GreetingFault SOAP-fout die vervolgens wordt geretourneerd naar de client.
De volgende IServiceBehavior implementatie voegt geen bindingparameterobjecten toe, voegt het aangepaste System.ServiceModel.Dispatcher.IErrorHandler object toe aan elke ChannelDispatcher.ErrorHandlers eigenschap en valideert dat elke bewerking van de service waarop het servicegedrag wordt toegepast en een System.ServiceModel.FaultContractAttribute type GreetingFaultheeft.
// This behavior modifies no binding parameters.
#region IServiceBehavior Members
public void AddBindingParameters(
ServiceDescription description,
ServiceHostBase serviceHostBase,
System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
System.ServiceModel.Channels.BindingParameterCollection parameters
)
{
return;
}
// This behavior is an IErrorHandler implementation and
// must be applied to each ChannelDispatcher.
public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
Console.WriteLine("The EnforceGreetingFaultBehavior has been applied.");
foreach(ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers)
{
chanDisp.ErrorHandlers.Add(this);
}
}
// This behavior requires that the contract have a SOAP fault with a detail type of GreetingFault.
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
Console.WriteLine("Validate is called.");
foreach (ServiceEndpoint se in description.Endpoints)
{
// Must not examine any metadata endpoint.
if (se.Contract.Name.Equals("IMetadataExchange")
&& se.Contract.Namespace.Equals("http://schemas.microsoft.com/2006/04/mex"))
continue;
foreach (OperationDescription opDesc in se.Contract.Operations)
{
if (opDesc.Faults.Count == 0)
throw new InvalidOperationException(String.Format(
"EnforceGreetingFaultBehavior requires a "
+ "FaultContractAttribute(typeof(GreetingFault)) in each operation contract. "
+ "The \"{0}\" operation contains no FaultContractAttribute.",
opDesc.Name)
);
bool gfExists = false;
foreach (FaultDescription fault in opDesc.Faults)
{
if (fault.DetailType.Equals(typeof(GreetingFault)))
{
gfExists = true;
continue;
}
}
if (!gfExists)
{
throw new InvalidOperationException(
"EnforceGreetingFaultBehavior requires a FaultContractAttribute(typeof(GreetingFault)) in an operation contract."
);
}
}
}
}
#endregion
' This behavior modifies no binding parameters.
#Region "IServiceBehavior Members"
Public Sub AddBindingParameters(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase, ByVal endpoints As System.Collections.ObjectModel.Collection(Of ServiceEndpoint), ByVal parameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IServiceBehavior.AddBindingParameters
Return
End Sub
' This behavior is an IErrorHandler implementation and
' must be applied to each ChannelDispatcher.
Public Sub ApplyDispatchBehavior(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase) Implements IServiceBehavior.ApplyDispatchBehavior
Console.WriteLine("The EnforceGreetingFaultBehavior has been applied.")
For Each chanDisp As ChannelDispatcher In serviceHostBase.ChannelDispatchers
chanDisp.ErrorHandlers.Add(Me)
Next chanDisp
End Sub
' This behavior requires that the contract have a SOAP fault with a detail type of GreetingFault.
Public Sub Validate(ByVal description As ServiceDescription, ByVal serviceHostBase As ServiceHostBase) Implements IServiceBehavior.Validate
Console.WriteLine("Validate is called.")
For Each se As ServiceEndpoint In description.Endpoints
' Must not examine any metadata endpoint.
If se.Contract.Name.Equals("IMetadataExchange") AndAlso se.Contract.Namespace.Equals("http://schemas.microsoft.com/2006/04/mex") Then
Continue For
End If
For Each opDesc As OperationDescription In se.Contract.Operations
If opDesc.Faults.Count = 0 Then
Throw New InvalidOperationException(String.Format("EnforceGreetingFaultBehavior requires a " & "FaultContractAttribute(typeof(GreetingFault)) in each operation contract. " & "The ""{0}"" operation contains no FaultContractAttribute.", opDesc.Name))
End If
Dim gfExists As Boolean = False
For Each fault As FaultDescription In opDesc.Faults
If fault.DetailType.Equals(GetType(GreetingFault)) Then
gfExists = True
Continue For
End If
Next fault
If gfExists = False Then
Throw New InvalidOperationException("EnforceGreetingFaultBehavior requires a FaultContractAttribute(typeof(GreetingFault)) in an operation contract.")
End If
Next opDesc
Next se
End Sub
#End Region
In dit voorbeeld implementeert System.ServiceModel.Configuration.BehaviorExtensionElementde gedragsklasse ook , waarmee het servicegedrag kan worden ingevoegd met behulp van deze in een toepassingsconfiguratiebestand, zoals in het volgende codevoorbeeld wordt gedemonstreerd.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="metaAndErrors">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService"/>
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metaAndErrors">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata httpGetEnabled="true"/>
<enforceGreetingFaults />
</behavior>
</serviceBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add
name="enforceGreetingFaults"
type="Microsoft.WCF.Documentation.EnforceGreetingFaultBehavior, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
Opmerkingen
Implementeren IServiceBehavior om een bepaald aspect van de uitvoering in de hele service te wijzigen, te onderzoeken of uit te breiden op toepassingsniveau:
Gebruik de ApplyDispatchBehavior methode om runtime-eigenschapswaarden te wijzigen of aangepaste extensieobjecten in te voegen, zoals fouthandlers, bericht- of parameter interceptors, beveiligingsextensies en andere aangepaste extensieobjecten.
Gebruik de methode Validate om de beschrijving te onderzoeken voordat Windows Communication Foundation (WCF) de uitvoerservice bouwt om te bevestigen dat deze correct kan worden uitgevoerd.
Gebruik de AddBindingParameters methode om een bindingselement door te geven aan de aangepaste informatie voor de service, zodat deze de service correct kan ondersteunen.
IServiceBehavior objecten kunnen gebruikmaken van een van deze methoden, maar vaak is slechts één belangrijk; in dergelijke gevallen kunnen de ongebruikte methoden zonder waarde worden geretourneerd.
Note
IServiceBehavior Alle methoden worden doorgegeven System.ServiceModel.Description.ServiceDescription en System.ServiceModel.ServiceHostBase objecten als parameters. De ServiceDescription parameter is alleen bedoeld voor onderzoek. Als u deze objecten wijzigt, is het uitvoeringsgedrag niet gedefinieerd.
Als u de aanpassingstaak wilt uitvoeren waarvoor het is bedoeld, moet het IServiceBehavior object worden toegevoegd aan de Behaviors eigenschap vóór de bouw van de serviceruntime. U kunt dit op drie manieren doen:
Voeg programmatisch het gedrag van de aangepaste service toe aan de Behaviors eigenschap voordat de ICommunicationObject.Open methode wordt aangeroepen op het System.ServiceModel.ServiceHost object.
Maak een aangepast kenmerk dat implementeert IServiceBehavior en gebruikt om serviceklassen te markeren die moeten worden gewijzigd. Wanneer een ServiceHost object is samengesteld, gebruikt WCF weerspiegeling om de kenmerken van het servicetype te detecteren. Als er kenmerken worden geïmplementeerd IServiceBehavior, worden ze toegevoegd aan de gedragverzameling op ServiceDescription.
Breid de System.ServiceModel.Configuration.BehaviorExtensionElement klasse uit om de specificatie van het gedrag in een toepassing of computerconfiguratiebestand te ondersteunen. Zie de sectie Voorbeeld voor meer informatie.
Voorbeelden van servicegedrag in WCF zijn het ServiceBehaviorAttribute kenmerk, de System.ServiceModel.Description.ServiceThrottlingBehavior, de System.ServiceModel.Description.ServiceDebugBehavior en het System.ServiceModel.Description.ServiceMetadataBehavior gedrag.
Methoden
| Name | Description |
|---|---|
| AddBindingParameters(ServiceDescription, ServiceHostBase, Collection<ServiceEndpoint>, BindingParameterCollection) |
Biedt de mogelijkheid om aangepaste gegevens door te geven aan bindingselementen ter ondersteuning van de contractuitvoering. |
| ApplyDispatchBehavior(ServiceDescription, ServiceHostBase) |
Biedt de mogelijkheid om runtime-eigenschapswaarden te wijzigen of aangepaste extensieobjecten in te voegen, zoals fouthandlers, bericht- of parameter interceptors, beveiligingsextensies en andere aangepaste extensieobjecten. |
| Validate(ServiceDescription, ServiceHostBase) |
Biedt de mogelijkheid om de servicehost en de servicebeschrijving te inspecteren om te bevestigen dat de service kan worden uitgevoerd. |