Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Transactions / WsatTransactionFormatter.cs / 2 / WsatTransactionFormatter.cs
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace System.ServiceModel.Transactions
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Security;
using System.Threading;
using System.Transactions;
using System.Xml;
using Microsoft.Transactions.Bridge;
using Microsoft.Transactions.Wsat.Messaging;
using Microsoft.Transactions.Wsat.Protocol;
using Microsoft.Win32;
using DiagnosticUtility = System.ServiceModel.DiagnosticUtility;
abstract class WsatTransactionFormatter : TransactionFormatter
{
bool initialized;
WsatConfiguration wsatConfig;
WsatProxy wsatProxy;
ProtocolVersion protocolVersion;
protected WsatTransactionFormatter(ProtocolVersion protocolVersion)
{
this.protocolVersion = protocolVersion;
}
//=======================================================================================
void EnsureInitialized()
{
if (!this.initialized)
{
lock (this)
{
if (!this.initialized)
{
this.wsatConfig = new WsatConfiguration();
this.wsatProxy = new WsatProxy(this.wsatConfig, this.protocolVersion);
this.initialized = true;
}
}
}
}
//=======================================================================================
public override void WriteTransaction(Transaction transaction, Message message)
{
EnsureInitialized();
ForcePromotion(transaction);
// Make a context and add it to the message
CoordinationContext context;
RequestSecurityTokenResponse issuedToken;
MarshalAsCoordinationContext(transaction, out context, out issuedToken);
if (issuedToken != null)
{
CoordinationServiceSecurity.AddIssuedToken(message, issuedToken);
}
WsatTransactionHeader header = new WsatTransactionHeader(context, this.protocolVersion);
message.Headers.Add(header);
}
//========================================================================================
void ForcePromotion(Transaction transaction)
{
// Force promotion. This may throw TransactionException.
// We used to check the DistributedIdentifier property first, but VSWhidbey bug 547901
// prevents us from doing so reliably in multi-threaded scenarios (there is a race
// in the System.Transactions code that can cause a NullReferenceException if we ask
// for the identifier while the transaction is being promoted)
TransactionInterop.GetTransmitterPropagationToken(transaction);
}
//=======================================================================================
public override TransactionInfo ReadTransaction(Message message)
{
EnsureInitialized();
CoordinationContext context = WsatTransactionHeader.GetCoordinationContext(message, this.protocolVersion);
if (context == null)
return null;
// Incoming transaction tokens are optional
RequestSecurityTokenResponse issuedToken;
try
{
issuedToken = CoordinationServiceSecurity.GetIssuedToken(message, context.Identifier, this.protocolVersion);
}
catch (XmlException e)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
new TransactionException(SR.FailedToDeserializeIssuedToken, e));
}
return new WsatTransactionInfo(this.wsatProxy, context, issuedToken);
}
//========================================================================================
public WsatTransactionInfo CreateTransactionInfo(CoordinationContext context,
RequestSecurityTokenResponse issuedToken)
{
return new WsatTransactionInfo(this.wsatProxy, context, issuedToken);
}
//========================================================================================
public void MarshalAsCoordinationContext(Transaction transaction,
out CoordinationContext context,
out RequestSecurityTokenResponse issuedToken)
{
Guid transactionId = transaction.TransactionInformation.DistributedIdentifier;
string nonNativeContextId = null;
context = new CoordinationContext(this.protocolVersion);
// Get timeout, description and isolation flags
uint timeout;
IsolationFlags isoFlags;
string description;
OleTxTransactionFormatter.GetTransactionAttributes(transaction,
out timeout,
out isoFlags,
out description);
context.IsolationFlags = isoFlags;
context.Description = description;
// If we can, use cached extended information
// Note - it may be worth using outgoing contexts more than once.
// We'll let performance profiling decide that question
WsatExtendedInformation info;
if (WsatExtendedInformationCache.Find(transaction, out info))
{
context.Expires = info.Timeout;
// The extended info cache only contains an identifier when it's non-native
if (!string.IsNullOrEmpty(info.Identifier))
{
context.Identifier = info.Identifier;
nonNativeContextId = info.Identifier;
}
}
else
{
context.Expires = timeout;
if (context.Expires == 0)
{
// If the timeout is zero, there are two possibilities:
// 1) This is a root transaction with an infinite timeout.
// 2) This is a subordinate transaction whose timeout was not flowed.
// We have no mechanism for distinguishing between the two cases.
//
// We could always return zero here, instead of using the local max timeout.
// The problem is that the 2004/08 WS-C spec does not specify the meaning
// of a zero expires field. While we accept zero to mean "as large as possible"
// it would be risky to expect others to do the same. So we only propagate
// zero in the expires field if the local max timeout has been disabled.
//
// This is MB 34596: how can we flow the real timeout?
context.Expires = (uint)TimeoutHelper.ToMilliseconds(this.wsatConfig.MaxTimeout);
}
}
if (context.Identifier == null)
{
context.Identifier = CoordinationContext.CreateNativeIdentifier(transactionId);
nonNativeContextId = null;
}
string tokenId;
if (!this.wsatConfig.IssuedTokensEnabled)
{
tokenId = null;
issuedToken = null;
}
else
{
CoordinationServiceSecurity.CreateIssuedToken(transactionId,
context.Identifier,
this.protocolVersion,
out issuedToken,
out tokenId);
}
AddressHeader refParam = new WsatRegistrationHeader(transactionId, nonNativeContextId, tokenId);
context.RegistrationService = wsatConfig.CreateRegistrationService(refParam, this.protocolVersion);
context.IsolationLevel = transaction.IsolationLevel;
context.LocalTransactionId = transactionId;
if (this.wsatConfig.OleTxUpgradeEnabled)
{
context.PropagationToken = TransactionInterop.GetTransmitterPropagationToken(transaction);
}
}
}
//-----------------------------------------------------------------------------------------
// Versioned Wsat transaction formatters
//------------------------------------------------------------------------------------------
class WsatTransactionFormatter10 : WsatTransactionFormatter
{
static WsatTransactionHeader emptyTransactionHeader = new WsatTransactionHeader(null, ProtocolVersion.Version10);
public WsatTransactionFormatter10() : base(ProtocolVersion.Version10) {}
//=======================================================================================
public override MessageHeader EmptyTransactionHeader
{
get { return emptyTransactionHeader; }
}
}
class WsatTransactionFormatter11 : WsatTransactionFormatter
{
static WsatTransactionHeader emptyTransactionHeader = new WsatTransactionHeader(null, ProtocolVersion.Version11);
public WsatTransactionFormatter11() : base(ProtocolVersion.Version11) {}
//=======================================================================================
public override MessageHeader EmptyTransactionHeader
{
get { return emptyTransactionHeader; }
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ArrayConverter.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- XomlCompilerError.cs
- MarkedHighlightComponent.cs
- DriveNotFoundException.cs
- Slider.cs
- WorkflowItemsPresenter.cs
- StylusPointPropertyUnit.cs
- DataObjectFieldAttribute.cs
- TextTabProperties.cs
- PathTooLongException.cs
- GlyphRunDrawing.cs
- thaishape.cs
- NotificationContext.cs
- WebControlAdapter.cs
- GZipStream.cs
- ExcludePathInfo.cs
- PeerEndPoint.cs
- Panel.cs
- ContentFileHelper.cs
- Literal.cs
- Composition.cs
- RemoteWebConfigurationHostStream.cs
- Parser.cs
- EndOfStreamException.cs
- CodeGotoStatement.cs
- CodeEntryPointMethod.cs
- ParagraphVisual.cs
- VirtualPath.cs
- Canvas.cs
- DataGridColumnHeaderItemAutomationPeer.cs
- SessionIDManager.cs
- MetadataException.cs
- Pen.cs
- DesignerView.cs
- MissingMemberException.cs
- ScrollBarRenderer.cs
- ListManagerBindingsCollection.cs
- StringResourceManager.cs
- ToolStripDropDownMenu.cs
- contentDescriptor.cs
- XsdDateTime.cs
- MediaPlayer.cs
- Command.cs
- DataGridViewRowConverter.cs
- TransactionInterop.cs
- Function.cs
- SmiMetaData.cs
- _ScatterGatherBuffers.cs
- SiteMap.cs
- Visitors.cs
- ExtentCqlBlock.cs
- XmlDocument.cs
- ScopelessEnumAttribute.cs
- DateTimeFormatInfo.cs
- ContentElement.cs
- ClientTargetSection.cs
- AnnotationAuthorChangedEventArgs.cs
- CheckBox.cs
- HttpResponse.cs
- Deflater.cs
- GridSplitterAutomationPeer.cs
- PartitionResolver.cs
- HttpChannelHelper.cs
- RegexGroupCollection.cs
- jithelpers.cs
- AssemblyFilter.cs
- FlowDocumentView.cs
- ProjectionQueryOptionExpression.cs
- CharEnumerator.cs
- ReadOnlyNameValueCollection.cs
- Operator.cs
- AdapterSwitches.cs
- TextDecorationLocationValidation.cs
- BitFlagsGenerator.cs
- ScriptResourceAttribute.cs
- AttributeEmitter.cs
- WmpBitmapDecoder.cs
- Stack.cs
- DescendantBaseQuery.cs
- NativeMethods.cs
- ArgumentNullException.cs
- ConfigurationManagerHelperFactory.cs
- ImpersonateTokenRef.cs
- DataGridViewRowEventArgs.cs
- BuilderInfo.cs
- ResolveResponse.cs
- SafeLibraryHandle.cs
- StatusBarPanelClickEvent.cs
- LookupBindingPropertiesAttribute.cs
- RefreshEventArgs.cs
- LoadWorkflowAsyncResult.cs
- securitymgrsite.cs
- TriggerActionCollection.cs
- MetadataCache.cs
- AsyncStreamReader.cs
- JapaneseCalendar.cs
- DataGridViewCellParsingEventArgs.cs
- Image.cs
- ControlTemplate.cs