IServiceBehavior Gränssnitt
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Tillhandahåller en mekanism för att ändra eller infoga anpassade tillägg i en hel tjänst, inklusive ServiceHostBase.
public interface class IServiceBehavior
public interface IServiceBehavior
type IServiceBehavior = interface
Public Interface IServiceBehavior
- Härledda
Exempel
I följande kodexempel visas användningen av ett tjänstbeteende som anges i en konfigurationsfil för att infoga en anpassad felhanterare i ett tjänstprogram. I det här exemplet fångar felhanteraren alla undantag och konverterar dem till ett anpassat GreetingFault SOAP-fel som sedan returneras till klienten.
Följande IServiceBehavior implementering lägger inte till några bindningsparameterobjekt, lägger till det anpassade System.ServiceModel.Dispatcher.IErrorHandler objektet i varje ChannelDispatcher.ErrorHandlers egenskap och verifierar att varje åtgärd av tjänsten som tjänstbeteendet tillämpas på och har en System.ServiceModel.FaultContractAttribute av typen GreetingFault.
// 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
I det här exemplet implementerar System.ServiceModel.Configuration.BehaviorExtensionElementbeteendeklassen också , vilket gör att tjänstbeteendet kan infogas med hjälp av det i en programkonfigurationsfil, vilket visas i följande kodexempel.
<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>
Kommentarer
Implementera IServiceBehavior för att ändra, undersöka eller utöka någon aspekt av tjänstomfattande körning på programnivå:
ApplyDispatchBehavior Använd metoden för att ändra körningsegenskapsvärden eller infoga anpassade tilläggsobjekt, till exempel felhanterare, meddelande- eller parameteravlyssnare, säkerhetstillägg och andra anpassade tilläggsobjekt.
Använd metoden Validate för att undersöka beskrivningen innan Windows Communication Foundation (WCF) skapar den körbara tjänsten för att bekräfta att den kan köras korrekt.
AddBindingParameters Använd metoden för att skicka den anpassade informationen för tjänsten till ett bindningselement så att den kan stödja tjänsten korrekt.
IServiceBehavior objekt kan använda någon av dessa metoder, men ofta är bara en viktig; i sådana fall kan de oanvända metoderna returneras utan ett värde.
Note
Alla metoder skickas IServiceBehaviorSystem.ServiceModel.Description.ServiceDescription och System.ServiceModel.ServiceHostBase objekt som parametrar. Parametern ServiceDescription är endast avsedd för undersökning. Om du ändrar dessa objekt är körningsbeteendet odefinierat.
För att kunna utföra anpassningsuppgiften som den är avsedd IServiceBehavior för måste objektet läggas till i Behaviors egenskapen innan tjänstens körningsmiljö byggs. Det finns tre sätt att göra detta:
Lägg programmatiskt till beteendet för den anpassade tjänsten till Behaviors egenskapen före den punkt där ICommunicationObject.Open metoden anropas för System.ServiceModel.ServiceHost objektet.
Skapa ett anpassat attribut som implementerar IServiceBehavior och använder det för att markera tjänstklasser som ska ändras. När ett ServiceHost objekt skapas använder WCF reflektion för att identifiera attributen för tjänsttypen. Om några attribut implementerar IServiceBehaviorläggs de till i beteendesamlingen på ServiceDescription.
System.ServiceModel.Configuration.BehaviorExtensionElement Utöka klassen för att stödja specifikationen av beteendet i en program- eller datorkonfigurationsfil. Mer information finns i avsnittet Exempel.
Exempel på tjänstbeteenden i WCF är ServiceBehaviorAttribute attributet , System.ServiceModel.Description.ServiceThrottlingBehavior, System.ServiceModel.Description.ServiceDebugBehavior och beteendet System.ServiceModel.Description.ServiceMetadataBehavior .
Metoder
| Name | Description |
|---|---|
| AddBindingParameters(ServiceDescription, ServiceHostBase, Collection<ServiceEndpoint>, BindingParameterCollection) |
Ger möjlighet att skicka anpassade data till bindningselement som stöd för kontraktsimplementeringen. |
| ApplyDispatchBehavior(ServiceDescription, ServiceHostBase) |
Ger möjlighet att ändra körningsegenskapsvärden eller infoga anpassade tilläggsobjekt som felhanterare, meddelande- eller parameteravlyssnare, säkerhetstillägg och andra anpassade tilläggsobjekt. |
| Validate(ServiceDescription, ServiceHostBase) |
Ger möjlighet att inspektera tjänstvärden och tjänstbeskrivningen för att bekräfta att tjänsten kan köras. |