Dela via


Konfigurera och utöka körningen 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 körningsbeteende för tjänsten och Ange körningsbeteende för klienten.

Funktioner

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 .

  • AddBindingParameters Använd metoden för att ändra eller lägga till anpassade objekt i en samling som anpassade bindningar kan komma åt för deras 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.

  • ApplyDispatchBehavior Använd metoderna och ApplyClientBehavior 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.

    Kommentar

    Ä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. ClientOperation På samma sätt exponerar klasserna och DispatchOperation klientåtgärdens körningsegenskaper respektive tilläggssamlingar. Du kan dock komma åt det bredare begränsade körningsobjektet från körningsobjektet för åtgärden och vice versa om det behövs.

Kommentar

En diskussion om körningsegenskaper och tilläggstyper som du kan använda för att ändra körningsbeteendet för en klient finns i Utöka klienter. En diskussion om körningsegenskaper och tilläggstyper som du kan använda för att ändra körningsbeteendet för en tjänstutskickare finns i 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 konstruktioner utgör beskrivningsträdet, som är den fullständiga specifikationen för att konstruera en körning för att stödja en tjänst eller klient som beskrivs i 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. Måste dock läggas till i en tjänstbeskrivning eller tjänstslutpunktsbeskrivning innan du anropar ICommunicationObject.OpenServiceHost eller ChannelFactory<TChannel>.

Beteendeomfattningar

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

Tjänstbeteenden

Tjänstbeteenden, som implementerar IServiceBehavior, är den primära mekanismen som du ändrar hela tjänstkörningen med. 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 är konstruerad ServiceHost använder implementeringen reflektion för att identifiera uppsättningen attribut för tjänstens typ. Om något av dessa attribut är implementeringar av IServiceBehaviorläggs de till i beteendesamlingen på ServiceDescription. Detta gör att dessa beteenden kan delta i byggandet av tjänstens körningstid.

  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änstkörningen i 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 , ChannelFactory<TChannel>undersöker WCF attributen i 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 motringningsklass. 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.

Slutpunktsbeteenden

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

Åtgärdsbeteenden, 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 åtgärd läggs till i antingen en ServiceHost eller en ChannelFactorylägger WCF till eventuella IOperationBehavior attribut till beteendesamlingen för den OperationDescription som skapades för åtgärden.

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.

Kommentar

Du kan också använda beteenden som stöder konfiguration för att tillämpa företagets programprinciper genom att infoga dem i konfigurationsfilen machine.config 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

Och System.ServiceModel.ChannelFactory<TChannel>System.ServiceModel.ServiceHost ansvarar för att skapa körningen från programmeringsmodellen och beskrivningen. Beteenden, som tidigare beskrivits, bidrar till den byggprocessen i tjänsten, slutpunkten, kontraktet och åtgärden.

Tillämpar ServiceHost beteenden i följande ordning:

  1. Tjänst

  2. Contract

  3. Slutpunkt

  4. Åtgärd

Ingen ordning garanteras i alla typer av beteenden.

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

  1. Contract

  2. Slutpunkt

  3. Åtgärd

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 metoden på CommunicationObject.OnOpeningSystem.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å samma sätt får värdena på klienten System.ServiceModel.Description.ServiceEndpoint 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 för den klassen och på överordnade i 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 ServiceBehaviorAttribute attributet för tjänst B är på "mer härledd" än för tjänst A.

Kontraktsbeteenden

För ett visst kontrakt tillämpas alla kontraktbeteendeattribut i gränssnittet och på överordnade i 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 åtgärd åsidosätter en befintlig åtgärd tillämpas alla funktionsbeteendeattribut för den åtgärden och på överordnade för den åtgärden. Om samma typ av attribut tillämpas på flera platser i arvshierarkin används den mest härledda typen.