Runtimegedrag van de service opgeven
Zodra u een servicecontract hebt ontworpen (Servicecontracten ontwerpen) en uw servicecontract hebt geïmplementeerd (Servicecontracten implementeren) kunt u het werkingsgedrag van de serviceruntime configureren. In dit onderwerp worden door het systeem geleverde service- en bewerkingsgedrag besproken en wordt beschreven waar u meer informatie kunt vinden om nieuw gedrag te maken. Hoewel sommige gedragingen worden toegepast als kenmerken, worden veel toegepast met behulp van een toepassingsconfiguratiebestand of programmatisch. Zie Services configureren voor meer informatie over het configureren van uw servicetoepassing.
Overzicht
Het contract definieert de invoer, uitvoer, gegevenstypen en mogelijkheden van een service van dat type. Het implementeren van een servicecontract maakt een klasse die, wanneer deze is geconfigureerd met een binding op een adres, voldoet aan het contract dat wordt geïmplementeerd. Contractuele, bindende en adresgegevens zijn allemaal bekend door de klant; zonder deze services kan de client geen gebruik maken van de service.
Bewerkingsspecifieke gegevens, zoals threadingproblemen of exemplaarbeheer, zijn echter ondoorzichtig voor clients. Zodra u uw servicecontract hebt geïmplementeerd, kunt u een groot aantal bewerkingskenmerken configureren met behulp van gedrag. Gedrag is objecten die de WCF-runtime (Windows Communication Foundation) wijzigen door een runtime-eigenschap in te stellen of door een aanpassingstype in te voegen in de runtime. Zie Uitbreiden van ServiceHost en de servicemodellaag voor meer informatie over het wijzigen van de runtime door het maken van door de gebruiker gedefinieerd gedrag.
De System.ServiceModel.ServiceBehaviorAttribute kenmerken en System.ServiceModel.OperationBehaviorAttribute kenmerken zijn het meest nuttige gedrag en maken de meest aangevraagde bewerkingsfuncties beschikbaar. Omdat het kenmerken zijn, past u deze toe op de implementatie van de service of bewerking. Andere gedragingen, zoals de System.ServiceModel.Description.ServiceMetadataBehavior of System.ServiceModel.Description.ServiceDebugBehavior, worden meestal toegepast met behulp van een toepassingsconfiguratiebestand, hoewel u ze programmatisch kunt gebruiken.
In dit onderwerp vindt u een overzicht van de ServiceBehaviorAttribute kenmerken en OperationBehaviorAttribute kenmerken, worden de verschillende bereiken beschreven waarop gedrag kan worden uitgevoerd en wordt een korte beschrijving gegeven van veel van het door het systeem geleverde gedrag op de verschillende bereiken die mogelijk interessant zijn voor WCF-ontwikkelaars.
ServiceBehaviorAttribute en OperationBehaviorAttribute
Het belangrijkste gedrag is de ServiceBehaviorAttribute en OperationBehaviorAttribute kenmerken die u kunt gebruiken om het volgende te beheren:
Levensduur van exemplaren
Ondersteuning voor gelijktijdigheid en synchronisatie
Configuratiegedrag
Transactiegedrag
Serialisatiegedrag
Metagegevenstransformatie
Levensduur van sessie
Adresfilters en headerverwerking
Imitatie
Als u deze kenmerken wilt gebruiken, markeert u de implementatie van de service of bewerking met het kenmerk dat geschikt is voor dat bereik en stelt u de eigenschappen in. In het volgende codevoorbeeld ziet u bijvoorbeeld een implementatie van een bewerking die gebruikmaakt van de OperationBehaviorAttribute.Impersonation eigenschap om te vereisen dat bellers van deze bewerking imitatie ondersteunen.
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Name="SampleHello",
Namespace="http://microsoft.wcf.documentation"
)]
public interface IHello
{
[OperationContract]
string Hello(string greeting);
}
public class HelloService : IHello
{
public HelloService()
{
Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
}
~HelloService()
{
Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
}
[OperationBehavior(Impersonation=ImpersonationOption.Required)]
public string Hello(string greeting)
{
Console.WriteLine("Called by: " + Thread.CurrentPrincipal.Identity.Name);
Console.WriteLine("IsAuthenticated: " + Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString());
Console.WriteLine("AuthenticationType: " + Thread.CurrentPrincipal.Identity.AuthenticationType.ToString());
Console.WriteLine("Caller sent: " + greeting);
Console.WriteLine("Sending back: Hi, " + Thread.CurrentPrincipal.Identity.Name);
return "Hi, " + Thread.CurrentPrincipal.Identity.Name;
}
}
}
Imports System.ServiceModel
Imports System.Threading
Namespace Microsoft.WCF.Documentation
<ServiceContract(Name:="SampleHello", Namespace:="http://microsoft.wcf.documentation")> _
Public Interface IHello
<OperationContract> _
Function Hello(ByVal greeting As String) As String
End Interface
Public Class HelloService
Implements IHello
Public Sub New()
Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
End Sub
Protected Overrides Sub Finalize()
Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
End Sub
<OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
Public Function Hello(ByVal greeting As String) As String Implements IHello.Hello
Console.WriteLine("Called by: " & Thread.CurrentPrincipal.Identity.Name)
Console.WriteLine("IsAuthenticated: " & Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString())
Console.WriteLine("AuthenticationType: " & Thread.CurrentPrincipal.Identity.AuthenticationType.ToString())
Console.WriteLine("Caller sent: " & greeting)
Console.WriteLine("Sending back: Hi, " & Thread.CurrentPrincipal.Identity.Name)
Return "Hi, " & Thread.CurrentPrincipal.Identity.Name
End Function
End Class
End Namespace
Veel van de eigenschappen vereisen extra ondersteuning van de binding. Een bewerking waarvoor een transactie van de client is vereist, moet bijvoorbeeld worden geconfigureerd voor het gebruik van een binding die stroomtransacties ondersteunt.
Bekende Singleton Services
U kunt de ServiceBehaviorAttribute en OperationBehaviorAttribute kenmerken gebruiken om bepaalde levensduuren te beheren, zowel van de InstanceContext als van de serviceobjecten die de bewerkingen implementeren.
De ServiceBehaviorAttribute.InstanceContextMode eigenschap bepaalt bijvoorbeeld hoe vaak de InstanceContext vrijgegeven wordt en het OperationBehaviorAttribute.ReleaseInstanceMode eigenschappenbesturingselement ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete wanneer het serviceobject wordt vrijgegeven.
U kunt echter ook zelf een serviceobject maken en de servicehost maken met behulp van dat object. Hiervoor moet u ook de ServiceBehaviorAttribute.InstanceContextMode eigenschap Single instellen op of een uitzondering wordt gegenereerd wanneer de servicehost wordt geopend.
Gebruik de ServiceHost(Object, Uri[]) constructor om een dergelijke service te maken. Het biedt een alternatief voor het implementeren van een aangepast exemplaar wanneer u een specifiek objectexemplaren System.ServiceModel.Dispatcher.IInstanceContextInitializer wilt opgeven voor gebruik door een singleton-service. U kunt deze overbelasting gebruiken wanneer uw serviceimplementatietype moeilijk te bouwen is (bijvoorbeeld als er geen openbare constructor zonder parameter wordt geïmplementeerd).
Houd er rekening mee dat wanneer een object aan deze constructor wordt verstrekt, sommige functies met betrekking tot het gedrag van Windows Communication Foundation (WCF) anders werken. Het aanroepen InstanceContext.ReleaseServiceInstance heeft bijvoorbeeld geen effect wanneer een bekend objectexemplaren wordt opgegeven. Op dezelfde manier wordt elk ander releasemechanisme voor exemplaren genegeerd. De ServiceHost klasse gedraagt zich altijd alsof de OperationBehaviorAttribute.ReleaseInstanceMode eigenschap is ingesteld ReleaseInstanceMode.None op alle bewerkingen.
Ander gedrag van service, eindpunt, contract en bewerking
Servicegedrag, zoals het ServiceBehaviorAttribute kenmerk, werkt voor een hele service. Als u de ServiceBehaviorAttribute.ConcurrencyMode eigenschap bijvoorbeeld instelt op ConcurrencyMode.Multiple u problemen met threadsynchronisatie in elke bewerking in die service zelf moet afhandelen. Eindpuntgedrag werkt voor een eindpunt; veel van het door het systeem geleverde eindpuntgedrag zijn voor clientfunctionaliteit. Contractgedrag werkt op contractniveau en bewerkingsgedrag wijzigt de levering van bewerkingen.
Veel van deze gedragingen worden geïmplementeerd op kenmerken en u maakt er gebruik van zoals u dat ServiceBehaviorAttribute doet en OperationBehaviorAttribute kenmerken, door ze toe te passen op de juiste serviceklasse of de juiste implementatie van bewerkingen. Andere gedragingen, zoals de ServiceMetadataBehavior of ServiceDebugBehavior objecten, worden meestal toegepast met behulp van een toepassingsconfiguratiebestand, hoewel ze ook programmatisch kunnen worden gebruikt.
De publicatie van metagegevens wordt bijvoorbeeld geconfigureerd met behulp van het ServiceMetadataBehavior object. In het volgende toepassingsconfiguratiebestand ziet u het meest voorkomende gebruik.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="metadataSupport"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService" />
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<!-- Adds a WS-MetadataExchange endpoint at -->
<!-- "http://localhost:8080/SampleService/mex" -->
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<!-- Enables the IMetadataExchange endpoint in services that -->
<!-- use "metadataSupport" in their behaviorConfiguration attribute. -->
<!-- In addition, the httpGetEnabled and httpGetUrl attributes publish -->
<!-- Service metadata for retrieval by HTTP/GET at the address -->
<!-- "http://localhost:8080/SampleService?wsdl" -->
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
In de volgende secties worden veel van de nuttigste door het systeem geleverde gedragingen beschreven die u kunt gebruiken om de runtimelevering van uw service of client te wijzigen. Zie het naslagonderwerp om te bepalen hoe u elk onderwerp gebruikt.
Servicegedrag
Het volgende gedrag werkt op services.
AspNetCompatibilityRequirementsAttribute. Toegepast op een WCF-service om aan te geven of die service kan worden uitgevoerd in ASP.NET compatibiliteitsmodus.
ServiceAuthorizationBehavior. Hiermee bepaalt u hoe de service clientclaims autoriseert.
ServiceCredentials. Hiermee configureert u een servicereferentie. Gebruik deze klasse om de referenties voor de service op te geven, zoals een X.509-certificaat.
ServiceDebugBehavior. Hiermee schakelt u foutopsporing en Help-informatiefuncties voor een WCF-service in.
ServiceMetadataBehavior. Hiermee bepaalt u de publicatie van servicemetagegevens en bijbehorende informatie.
ServiceSecurityAuditBehavior. Hiermee geeft u het controlegedrag van beveiligingsgebeurtenissen op.
ServiceThrottlingBehavior. Hiermee configureert u runtimedoorvoerinstellingen waarmee u de serviceprestaties kunt afstemmen.
Eindpuntgedrag
Het volgende gedrag werkt op eindpunten. Veel van deze gedragingen worden gebruikt in clienttoepassingen.
CallbackBehaviorAttribute. Hiermee configureert u een callback-service-implementatie in een duplex-clienttoepassing.
CallbackDebugBehavior. Hiermee schakelt u serviceopsporing in voor een WCF-callback-object.
ClientCredentials. Hiermee kan de gebruiker client- en servicereferenties configureren, evenals verificatie-instellingen voor servicereferenties voor gebruik op de client.
ClientViaBehavior. Wordt door clients gebruikt om de URI (Uniform Resource Identifier) op te geven waarvoor het transportkanaal moet worden gemaakt.
MustUnderstandBehavior. Hiermee wordt WCF geïnstrueerd om de
MustUnderstand
verwerking uit te schakelen.SynchronousReceiveBehavior. Hiermee geeft u de runtime de opdracht om een synchroon ontvangstproces voor kanalen te gebruiken.
TransactedBatchingBehavior. Optimaliseert de ontvangstbewerkingen voor transporten die ondersteuning bieden voor transactionele ontvangst.
Contractgedrag
DeliveryRequirementsAttribute. Hiermee geeft u de functievereisten op die bindingen moeten bieden aan de service- of client-implementatie.
Werkingsgedrag
In het volgende bewerkingsgedrag worden serialisatie- en transactiebesturingselementen voor bewerkingen opgegeven.
DataContractSerializerOperationBehavior. Vertegenwoordigt het runtimegedrag van de System.Runtime.Serialization.DataContractSerializer.
XmlSerializerOperationBehavior. Hiermee bepaalt u het runtimegedrag van de
XmlSerializer
en koppelt u deze aan een bewerking.TransactionFlowAttribute. Hiermee geeft u het niveau op waarin een servicebewerking een transactieheader accepteert.