Dela via


Konfigurera och utöka körtiden med beteenden

Med beteenden kan du ändra standardbeteendet och lägga till anpassade tillägg som inspekterar och validerar tjänstkonfigurationen eller ändrar körningsbeteendet i WCF-klient- och tjänstprogram (Windows Communication Foundation). Det här avsnittet beskriver beteendegränssnitten, hur du implementerar dem och hur du lägger till dem i tjänstbeskrivningen (i ett tjänstprogram) eller slutpunkten (i ett klientprogram) programmatiskt eller i en konfigurationsfil. Mer information om hur du använder systembaserade beteenden finns i Ange tjänst Run-Time beteende och ange klient Run-Time beteende.

Beteenden

Beteendetyper läggs till i tjänst- eller tjänstslutpunktsbeskrivningsobjekten (på tjänsten eller klienten) innan dessa objekt används av Windows Communication Foundation (WCF) för att skapa en körning som kör en WCF-tjänst eller en WCF-klient. När dessa beteenden anropas under körningskonstruktionsprocessen kan de sedan komma åt körningsegenskaper och metoder som ändrar körningen som skapas av kontraktet, bindningar och adresser.

Beteendemetoder

Alla beteenden har en AddBindingParameters metod, en ApplyDispatchBehavior metod, en Validate metod och en ApplyClientBehavior metod med ett undantag: Eftersom IServiceBehavior det inte går att köra i en klient implementerar ApplyClientBehaviorden inte .

  • Använd AddBindingParameters-metoden för att ändra eller lägga till anpassade objekt i en samling som anpassade bindningar kan komma åt för sin användning när körningen konstrueras. Det här är till exempel hur skyddskraven anges som påverkar hur kanalen skapas, men som inte är kända av kanalutvecklaren.

  • Validate Använd metoden för att undersöka beskrivningsträdet och motsvarande körningsobjekt för att säkerställa att det överensstämmer med vissa kriterier.

  • Använd ApplyDispatchBehavior och ApplyClientBehavior metoderna för att undersöka beskrivningsträdet och ändra körningen för ett visst omfång på antingen tjänsten eller klienten. Du kan också infoga tilläggsobjekt.

    Anmärkning

    Även om det finns ett beskrivningsträd i dessa metoder är det endast för undersökning. Om ett beskrivningsträd ändras är beteendet odefinierat.

De egenskaper som du kan ändra och de anpassningsgränssnitt som du kan implementera nås via tjänst- och klientkörningsklasserna. Tjänsttyperna är klasserna DispatchRuntime och DispatchOperation . Klienttyperna är klasserna ClientRuntime och ClientOperation . Klasserna ClientRuntime och DispatchRuntime är startpunkterna för utökningsbarhet för åtkomst till klientomfattande och tjänstomfattande körningsegenskaper respektive tilläggssamlingar. På samma sätt exponerar ClientOperation- och DispatchOperation-klasserna klientåtgärdens och tjänståtgärdens körningsegenskaper respektive tilläggssamlingar. Du kan dock få tillgång till det bredare avgränsade körningsobjektet från körningens åtgärdsobjekt och vice versa om det behövs.

Anmärkning

För en diskussion om köregenskaper och tilläggstyper som du kan använda för att ändra körningsbeteendet hos en klient, se Utöka klienter. För en diskussion om köregenskaper och utökningstyper som du kan använda för att ändra körningsbeteendet hos en tjänstdispatcher, se Utöka dispatchers.

De flesta WCF-användare interagerar inte direkt med körningen. I stället använder de grundläggande programmeringsmodellkonstruktioner som slutpunkter, kontrakt, bindningar, adresser och beteendeattribut för klasser eller beteenden i konfigurationsfiler. Dessa komponenter utgör beskrivningsträdet, som är den fullständiga specifikationen för att konstruera en runtime-miljö för att stödja en tjänst eller klient som beskrivs av beskrivningsträdet.

Det finns fyra typer av beteenden i WCF:

Du kan lägga till dessa beteenden i de olika beskrivningsobjekten genom att implementera anpassade attribut, använda programkonfigurationsfiler eller direkt genom att lägga till dem i beteendesamlingen på lämpligt beskrivningsobjekt. Det måste dock läggas till i en tjänstbeskrivning eller tjänstslutpunktsbeskrivning innan man anropar ICommunicationObject.OpenServiceHost eller ChannelFactory<TChannel>.

Beteendeomfång

Det finns fyra beteendetyper som var och en motsvarar ett visst omfång för åtkomst under körning.

Tjänstbeteenden

Tjänstbeteenden, som implementerar IServiceBehavior, är den primära mekanismen för att ändra hela tjänstens körtid. Det finns tre mekanismer för att lägga till tjänstbeteenden i en tjänst.

  1. Använda ett attribut i tjänstklassen. När en ServiceHost konstrueras använder ServiceHost-implementeringen reflektion för att identifiera uppsättningen attribut på typen av tjänsten. Om något av dessa attribut är implementeringar av IServiceBehaviorläggs de till i beteendesamlingen på ServiceDescription. Detta gör att dessa beteenden kan bidra till uppbyggnaden av tjänstens exekveringstid.

  2. Programmatiskt lägga till beteendet i beteendesamlingen på ServiceDescription. Detta kan åstadkommas med följande kodrader:

    ServiceHost host = new ServiceHost(/* Parameters */);  
    host.Description.Behaviors.Add(/* Service Behavior */);  
    
  3. Implementera en anpassad BehaviorExtensionElement som utökar konfigurationen. På så sätt kan du använda tjänstbeteendet från programkonfigurationsfiler.

Exempel på tjänstbeteenden i WCF är ServiceBehaviorAttribute attributet, ServiceThrottlingBehavior, och beteendet ServiceMetadataBehavior .

Kontraktsbeteenden

Kontraktsbeteenden, som implementerar IContractBehavior-gränssnittet, används för att utöka både klient- och tjänstens körning i samband med ett kontrakt.

Det finns två mekanismer för att lägga till kontraktsbeteenden i ett kontrakt. Den första mekanismen är att skapa ett anpassat attribut som ska användas i kontraktsgränssnittet. När ett kontraktsgränssnitt skickas till antingen en ServiceHost eller en ChannelFactory<TChannel>, undersöker WCF attributen på gränssnittet. Om några attribut är implementeringar av IContractBehaviorläggs de till i beteendesamlingen på den System.ServiceModel.Description.ContractDescription som skapats för gränssnittet.

Du kan också implementera attributet System.ServiceModel.Description.IContractBehaviorAttribute för anpassat kontraktbeteende. I det här fallet är beteendet följande när det tillämpas på:

•Ett kontraktsgränssnitt. I det här fallet tillämpas beteendet på alla kontrakt av den typen i valfri slutpunkt och WCF ignorerar värdet för IContractBehaviorAttribute.TargetContract egenskapen.

•En tjänstklass. I det här fallet tillämpas beteendet endast på slutpunkter vars kontrakt är värdet för TargetContract egenskapen.

•En callback-klass. I det här fallet tillämpas beteendet på duplex-klientens slutpunkt och WCF ignorerar värdet för TargetContract egenskapen.

Den andra mekanismen är att lägga till beteendet i beteendesamlingen på en ContractDescription.

Exempel på kontraktsbeteenden i WCF är attributet System.ServiceModel.DeliveryRequirementsAttribute . Mer information och ett exempel finns i referensavsnittet.

Ändpunktsbeteenden

Slutpunktsbeteenden, som implementerar IEndpointBehavior, är den primära mekanismen genom vilken du ändrar hela tjänst- eller klientkörningstiden för en specifik slutpunkt.

Det finns två mekanismer för att lägga till slutpunktsbeteenden i en tjänst.

  1. Lägg till beteendet i Behaviors egenskapen.

  2. Implementera en anpassad BehaviorExtensionElement som utökar konfigurationen.

Mer information och ett exempel finns i referensavsnittet.

Åtgärdsbeteenden

Driftbeteenden, som implementerar IOperationBehavior gränssnittet, används för att utöka både klient- och tjänstkörningen för varje åtgärd.

Det finns två mekanismer för att lägga till åtgärdsbeteenden i en åtgärd. Den första mekanismen är att skapa ett anpassat attribut som ska användas på den metod som modellerar åtgärden. När en operation läggs till i antingen en ServiceHost eller en ChannelFactory, lägger WCF till eventuella IOperationBehavior attribut till beteendesamlingen för den OperationDescription som skapas för den operationen.

Den andra mekanismen är genom att direkt lägga till beteendet i beteendesamlingen på en konstruerad OperationDescription.

Exempel på åtgärdsbeteenden i WCF är OperationBehaviorAttribute och TransactionFlowAttribute.

Mer information och ett exempel finns i referensavsnittet.

Använda Konfiguration för att skapa beteenden

Tjänst- och slutpunkts- och kontraktsbeteenden kan utformas för att anges i kod eller med hjälp av attribut. Endast tjänst- och slutpunktsbeteenden kan konfigureras med hjälp av program- eller webbkonfigurationsfiler. Om du exponerar beteenden med hjälp av attribut kan utvecklare ange ett beteende vid kompileringstid som inte kan läggas till, tas bort eller ändras vid körning. Detta är ofta lämpligt för beteenden som alltid krävs för korrekt drift av en tjänst (till exempel transaktionsrelaterade parametrar till System.ServiceModel.ServiceBehaviorAttribute attributet). Genom att exponera beteenden med hjälp av konfigurationen kan utvecklare lämna specifikationen och konfigurationen av dessa beteenden till dem som distribuerar tjänsten. Detta är lämpligt för beteenden som är valfria komponenter eller annan distributionsspecifik konfiguration, till exempel om metadata exponeras för tjänsten eller den specifika auktoriseringskonfigurationen för en tjänst.

Anmärkning

Du kan också använda beteenden som stöder konfiguration för att tillämpa företagets programprinciper genom att infoga dem i machine.config-konfigurationsfilen och låsa objekten. En beskrivning och ett exempel finns i How to: Lock Down Endpoints in the Enterprise (Så här låser du slutpunkter i Enterprise).

För att exponera ett beteende med hjälp av konfigurationen måste en utvecklare skapa en härledd klass av BehaviorExtensionElement och sedan registrera tillägget med konfigurationen.

Följande kodexempel visar hur en IEndpointBehavior implementerar BehaviorExtensionElement:

// BehaviorExtensionElement members  
public override Type BehaviorType  
{  
  get { return typeof(EndpointBehaviorMessageInspector); }  
}  
  
protected override object CreateBehavior()  
{  
  return new EndpointBehaviorMessageInspector();  
}  

För att konfigurationssystemet ska kunna läsa in en anpassad BehaviorExtensionElementmåste det registreras som ett tillägg. I följande kodexempel visas konfigurationsfilen för det föregående slutpunktsbeteendet:

<configuration>  
  <system.serviceModel>  
    <services>  
      <service
        name="Microsoft.WCF.Documentation.SampleService"  
        behaviorConfiguration="metadataSupport"  
      >  
        <host>  
          <baseAddresses>  
            <add baseAddress="http://localhost:8080/ServiceMetadata" />  
          </baseAddresses>  
        </host>  
        <endpoint  
          address="/SampleService"  
          binding="wsHttpBinding"  
          behaviorConfiguration="withMessageInspector"
          contract="Microsoft.WCF.Documentation.ISampleService"  
        />  
        <endpoint  
           address="mex"  
           binding="mexHttpBinding"  
           contract="IMetadataExchange"  
        />  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
      <behavior name="metadataSupport">  
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>  
      </behavior>  
      </serviceBehaviors>  
      <endpointBehaviors>  
        <behavior name="withMessageInspector">  
          <endpointMessageInspector />  
        </behavior>  
      </endpointBehaviors>  
    </behaviors>  
    <extensions>  
      <behaviorExtensions>  
        <add
          name="endpointMessageInspector"  
          type="Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"  
        />  
      </behaviorExtensions>  
    </extensions>  
  </system.serviceModel>  
</configuration>  

Var Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector är beteendetilläggstypen och HostApplication är namnet på sammansättningen som klassen har kompilerats till.

Utvärderingsbeställning

Ansvariga för att bygga körningen från programmeringsmodellen och beskrivningen är System.ServiceModel.ChannelFactory<TChannel> och System.ServiceModel.ServiceHost. Beteenden, som tidigare beskrivits, bidrar till byggprocessen i tjänsten, slutpunkten, kontraktet och operationen.

Tillämpar ServiceHost beteenden i följande ordning:

  1. Tjänster

  2. Kontrakt

  3. Slutpunkt

  4. Verksamhet

Ingen ordning är garanterad inom en samling av beteenden.

Tillämpar ChannelFactory<TChannel> beteenden i följande ordning:

  1. Kontrakt

  2. Slutpunkt

  3. Verksamhet

Inom en samling beteenden garanteras återigen ingen ordning.

Lägga till beteenden programmatiskt

Egenskaperna för System.ServiceModel.Description.ServiceDescription i tjänstprogrammet får inte ändras efter att CommunicationObject.OnOpening-metoden har anropats på System.ServiceModel.ServiceHostBase. Vissa medlemmar, till exempel ServiceHostBase.Credentials egenskapen och AddServiceEndpoint metoderna på ServiceHostBase och System.ServiceModel.ServiceHost, utlöser ett undantag om de ändras efter den punkten. Andra tillåter att du ändrar dem, men resultatet är odefinierat.

På klientsidan får System.ServiceModel.Description.ServiceEndpoint-värdena inte ändras efter anropet till OnOpeningSystem.ServiceModel.ChannelFactory. Egenskapen ChannelFactory.Credentials genererar ett undantag om det ändras efter den punkten, men de andra klientbeskrivningsvärdena kan ändras utan fel. Resultatet är dock odefinierat.

Oavsett om det gäller tjänsten eller klienten rekommenderar vi att du ändrar beskrivningen innan du anropar CommunicationObject.Open.

Arvsregler för beteendeattribut

Alla fyra typerna av beteenden kan fyllas i med hjälp av attribut – tjänstbeteenden och kontraktsbeteenden. Eftersom attribut definieras för hanterade objekt och medlemmar, och hanterade objekt och medlemmar stöder arv, är det nödvändigt att definiera hur beteendeattribut fungerar i samband med arv.

På hög nivå är regeln att för ett visst omfång (till exempel tjänst, kontrakt eller åtgärd) tillämpas alla beteendeattribut i arvshierarkin för det omfånget. Om det finns två beteendeattribut av samma typ används endast den mest härledda typen.

Tjänstbeteenden

För en viss tjänstklass tillämpas alla tjänstbeteendeattribut på den klassen och på föräldrar till den klassen. Om samma typ av attribut tillämpas på flera platser i arvshierarkin används den mest härledda typen.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]  
[AspNetCompatibilityRequirementsAttribute(  
    AspNetCompatibilityRequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]  
public class A { /* … */ }  
  
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]  
public class B : A { /* … */}  

I det föregående fallet får tjänsten B till exempel ett InstanceContextMode av Single, ett AspNetCompatibilityRequirementsMode läge för Allowedoch ett ConcurrencyMode av Single. ConcurrencyMode är Single, eftersom attributet ServiceBehaviorAttribute för tjänst B är mer härlett än det för tjänst A.

Kontraktsbeteenden

För ett visst kontrakt tillämpas alla kontraktsbeteendeattribut på det gränssnittet och på föräldrar till det gränssnittet. Om samma typ av attribut tillämpas på flera platser i arvshierarkin används den mest härledda typen.

Åtgärdsbeteenden

Om en viss åtgärd inte åsidosätter en befintlig abstrakt eller virtuell åtgärd gäller inga arvsregler.

Om en operation åsidosätter en befintlig operation, tillämpas alla funktionsbeteendeattribut för den operationen och dess föräldrar. Om samma typ av attribut tillämpas på flera platser i arvshierarkin används den mest härledda typen.