Dela via


ServiceModel-transaktionsattribut

Windows Communication Foundation (WCF) innehåller egenskaper för tre standardattribut System.ServiceModel som gör att du kan konfigurera beteendet för transaktioner för en WCF-tjänst:

TransactionFlowAttribute

Attributet TransactionFlowAttribute anger viljan för en åtgärd i ett tjänstkontrakt att acceptera inkommande transaktioner från en klient. Attributet tillhandahåller den här kontrollen med följande egenskap: Transaktioner använder TransactionFlowOption uppräkningen för att ange om en inkommande transaktion är Mandatory, Allowedeller NotAllowed.

Det här är det enda attribut som relaterar tjänståtgärder till externa interaktioner med en klient. Egenskaperna som beskrivs i följande avsnitt gäller användningen av transaktioner vid utförandet av åtgärden.

ServiceBehaviorAttribute

Attributet ServiceBehaviorAttribute anger det interna körningsbeteendet för en tjänstkontraktsimplementering. Transaktionsspecifika egenskaper för det här attributet är:

  • TransactionAutoCompleteOnSessionClose anger om en transaktion som inte har slutförts ska slutföras när sessionen stängs. Standardvärdet för den här egenskapen är false. Om den här egenskapen är true, och den inkommande sessionen stängdes ner smidigt i stället för att avslutas på grund av nätverks- eller klientfel, slutförs varje ej slutförd transaktion framgångsrikt. Annars, om den här egenskapen är false eller om sessionen inte stängdes korrekt, återställs alla oavslutade transaktioner när sessionen stängs. Om den här egenskapen är truemåste den inkommande kanalen vara sessionsbaserad.

  • ReleaseServiceInstanceOnTransactionComplete anger om den underliggande tjänstinstansen släpps när en transaktion slutförs. Standardvärdet för den här egenskapen är true. Nästa inkommande meddelande gör att en ny underliggande instans skapas, vilket tar bort alla tillstånd per transaktion som den tidigare instansen kan ha haft. Att släppa en tjänstinstans är en intern åtgärd som tjänsten vidtar och har ingen inverkan på befintliga anslutningar eller sessioner som klienter kan ha upprättat. Den här funktionen motsvarar just-in-time-aktiveringsfunktionen SOM COM+ tillhandahåller. Om egenskapen är truemåste ConcurrencyMode vara lika med Single. I annat fall utlöser tjänsten ett ogiltigt konfigurationsverifieringsfel under starten.

  • TransactionIsolationLevel anger den isoleringsnivå som ska användas för transaktioner inom tjänsten. Den här egenskapen tar ett av IsolationLevel värdena. Om egenskapen för lokal isoleringsnivå är något annat än Unspecifiedmåste isoleringsnivån för en inkommande transaktion matcha inställningen för den här lokala egenskapen. Annars avvisas den inkommande transaktionen och ett fel skickas tillbaka till klienten. Om TransactionScopeRequired är true, och ingen transaktion flödas, avgör den här egenskapen det värde som IsolationLevel ska användas för den lokalt skapade transaktionen. Om IsolationLevel är inställt på Unspecifiedanvänds IsolationLevelSerializable .

  • TransactionTimeout anger den tidsperiod inom vilken en ny transaktion som skapats i tjänsten måste slutföras. Om den här tiden nås och transaktionen inte har slutförts avbryts den. TimeSpan används som TransactionScope-timeout för alla operationer som har TransactionScopeRequired inställt till true och för vilka en ny transaktion har skapats. Tidsgränsen är den maximala tillåtna varaktigheten från skapandet av transaktionen till slutförandet av fas 1 i tvåfas-incheckningsprotokollet. Tidsgränsvärdet som används är alltid det lägre värdet mellan TransactionTimeout egenskapen och konfigurationsinställningen transactionTimeout .

Attribut för operationsbeteende

Attributet OperationBehaviorAttribute anger beteendet för metoderna i tjänstimplementeringen. Du kan använda den för att ange operationens specifika exekveringsbeteende. Egenskaperna för det här attributet påverkar inte WSDL-beskrivningen (Web Service Description Language) för tjänstkontraktet och är enbart element i WCF-programmeringsmodellen som gör det möjligt för vanliga funktioner som utvecklare annars måste implementera själva.

Det här attributet har följande transaktionsspecifika egenskaper:

  • TransactionScopeRequired anger om en metod måste köras inom ett aktivt transaktionsomfång. Standardvärdet är false. OperationBehaviorAttribute Om attributet inte har angetts för en metod innebär det också att metoden inte kommer att köras i en transaktion. Om ett transaktionsomfång inte krävs för en åtgärd aktiveras ingen transaktion som finns i meddelandehuvudet och förblir som ett element i IncomingMessageProperties i OperationContext. Om ett transaktionsomfång krävs för en åtgärd härleds källan för transaktionen från något av följande:

    • Om en transaktion kommer från klienten körs metoden inom ramen för ett transaktionsomfång som skapats med den distribuerade transaktionen.

    • Med en köad transport används den transaktion som används för att avköa meddelandet. Observera att den transaktion som används inte är en flödestransaktion, eftersom den inte tillhandahölls av meddelandets ursprungliga avsändare.

    • En anpassad transport kan erbjuda en transaktion genom användning av TransportTransactionProperty.

    • Om inget av ovanstående innehåller en extern källa för en transaktion skapas en ny Transaction instans omedelbart innan metoden anropas.

  • TransactionAutoComplete anger om transaktionen där metoden körs slutförs automatiskt om inga ohanterade undantag utlöses. Om den här egenskapen är truemarkerar den anropande infrastrukturen automatiskt transaktionen som "slutförd" om användarmetoden returnerar utan att utlösa ett undantag. Om den här egenskapen är falseär transaktionen kopplad till instansen och markeras endast som "slutförd" om klienten anropar en efterföljande metod som är markerad med den här egenskapen lika truemed eller om en efterföljande metod uttryckligen anropar SetTransactionComplete. Det går inte att utföra något av dessa, vilket resulterar i att transaktionen aldrig "slutförs", och det inneslutna arbetet inte har bekräftats, såvida inte TransactionAutoCompleteOnSessionClose-egenskapen har angetts till true. Om den här egenskapen är inställd på truemåste du använda en kanal med en session och InstanceContextMode måste vara inställd på PerSession.