Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / TransactionBridge / Microsoft / Transactions / Wsat / Recovery / DotNetATv1WindowsLogEntrySerializer.cs / 1 / DotNetATv1WindowsLogEntrySerializer.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- // This file contains the knowledge of how to serialize a v1 WS-AT log entry record using System; using System.ServiceModel.Channels; using System.Diagnostics; using System.IO; using System.IdentityModel.Claims; using System.IdentityModel.Policy; using System.ServiceModel; using System.Text; using System.Xml; using Microsoft.Transactions.Bridge; using Microsoft.Transactions.Wsat.Messaging; using Microsoft.Transactions.Wsat.Protocol; using DiagnosticUtility = Microsoft.Transactions.Bridge.DiagnosticUtility; namespace Microsoft.Transactions.Wsat.Recovery { [Flags] enum WsATv1LogEntryFlags : byte { OptimizedEndpointRepresentation = 0x01, UsesDefaultPort = 0x02, UsesStandardCoordinatorAddressPath = 0x04, UsesStandardParticipantAddressPath = 0x08, } enum WsATv1LogEntryVersion : byte { v1 = 1, v2 = 2, } class WsATv1LogEntrySerializer : LogEntrySerializer { ProtocolVersion protocolVersion; static readonly string standardCoordinatorAddressPath10 = "/" + BindingStrings.AddressPrefix + "/" + BindingStrings.TwoPhaseCommitCoordinatorSuffix(ProtocolVersion.Version10); static readonly string standardCoordinatorAddressPath11 = "/" + BindingStrings.AddressPrefix + "/" + BindingStrings.TwoPhaseCommitCoordinatorSuffix(ProtocolVersion.Version11); static readonly string standardParticipantAddressPath10 = "/" + BindingStrings.AddressPrefix + "/" + BindingStrings.TwoPhaseCommitParticipantSuffix(ProtocolVersion.Version10); static readonly string standardParticipantAddressPath11 = "/" + BindingStrings.AddressPrefix + "/" + BindingStrings.TwoPhaseCommitParticipantSuffix(ProtocolVersion.Version11); public WsATv1LogEntrySerializer(LogEntry logEntry, ProtocolVersion protocolVersion) : base(logEntry) { this.protocolVersion = protocolVersion; } public static string StandardCoordinatorAddressPath (ProtocolVersion protocolVersion) { ProtocolVersionHelper.AssertProtocolVersion(protocolVersion, typeof(WsATv1LogEntrySerializer), "StandardCoordinatorAddressPath"); //assert valid protocol version switch (protocolVersion) { case ProtocolVersion.Version10 : return standardCoordinatorAddressPath10; case ProtocolVersion.Version11 : return standardCoordinatorAddressPath11; default : return null; // inaccessible path because we have asserted the protocol version } } public static string StandardParticipantAddressPath (ProtocolVersion protocolVersion) { ProtocolVersionHelper.AssertProtocolVersion(protocolVersion, typeof(WsATv1LogEntrySerializer), "StandardParticipantAddressPath"); //assert valid protocol version switch (protocolVersion) { case ProtocolVersion.Version10 : return standardParticipantAddressPath10; case ProtocolVersion.Version11 : return standardParticipantAddressPath11; default : return null; // inaccessible path because we have asserted the protocol version } } protected override void SerializeExtended() { DebugTrace.TraceEnter(this, "SerializeExtended"); WsATv1LogEntryFlags flags = 0, pathFlags = 0; EndpointAddress address = this.logEntry.Endpoint; Uri uri = address.Uri; // Check for a remote enlistment id (and nothing else) in the ref params // If we don't have this, give up and fallback to serializing the entire EPR Guid remoteEnlistmentId; if (GetRemoteEnlistmentId(address, out remoteEnlistmentId)) { // Great. We can optimize the serialization of this EPR flags |= WsATv1LogEntryFlags.OptimizedEndpointRepresentation; // Make sure the EPR contains an https address // It is worth noting that we will not reach this point without an address // that the HttpsChannelFactory has accepted, but it's worth checking anyway if (string.Compare(uri.Scheme, Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase) != 0) { DiagnosticUtility.FailFast("Endpoints must use the HTTPS scheme"); } // Check for the default port if (Configuration.DefaultHttpsPort == uri.Port) { flags |= WsATv1LogEntryFlags.UsesDefaultPort; } // Check for a standard address path pathFlags = GetPathFlags(address, this.protocolVersion); flags |= pathFlags; } // // Write extended information to the stream // if (DebugTrace.Verbose) { DebugTrace.Trace(TraceLevel.Verbose, "SerializeExtended flags: {0}", flags); } // Version byte version = 0; ProtocolVersionHelper.AssertProtocolVersion(protocolVersion, this.GetType(), "SerializeExtended"); //assert valid protocol version switch (this.protocolVersion) { case ProtocolVersion.Version10 : version = (byte)WsATv1LogEntryVersion.v1; break; case ProtocolVersion.Version11 : version = (byte)WsATv1LogEntryVersion.v2; break; // no default - we already asserted the protocol version } this.mem.WriteByte(version); if (DebugTrace.Verbose) { DebugTrace.Trace(TraceLevel.Verbose, "Wrote version: {0} bytes", this.mem.Length); } // Flags this.mem.WriteByte((byte)flags); if (DebugTrace.Verbose) { DebugTrace.Trace(TraceLevel.Verbose, "Wrote flags: {0} bytes", this.mem.Length); } if ((flags & WsATv1LogEntryFlags.OptimizedEndpointRepresentation) == 0) { SerializationUtils.WriteEndpointAddress(this.mem, address, this.protocolVersion); } else { // Remote enlistmentId SerializationUtils.WriteGuid(this.mem, ref remoteEnlistmentId); if (DebugTrace.Verbose) { DebugTrace.Trace(TraceLevel.Verbose, "Wrote enlistmentId: {0} bytes", this.mem.Length); } // HostName SerializationUtils.WriteString(this.mem, uri.Host); if (DebugTrace.Verbose) { DebugTrace.Trace(TraceLevel.Verbose, "Wrote hostName: {0} bytes", this.mem.Length); } // Port if ((flags & WsATv1LogEntryFlags.UsesDefaultPort) == 0) { if (!(uri.Port >= System.Net.IPEndPoint.MinPort && uri.Port <= System.Net.IPEndPoint.MaxPort)) { // Between the time we captured the port and the time we write it out, // the value should still appear to be valid. If things change, we have // a bug somewhere and need to crash so that we don't write an invalid log entry. DiagnosticUtility.FailFast("TCP port must be valid"); } SerializationUtils.WriteInt(this.mem, uri.Port); if (DebugTrace.Verbose) { DebugTrace.Trace(TraceLevel.Verbose, "Wrote port: {0} bytes", this.mem.Length); } } // Path if (pathFlags == 0) { SerializationUtils.WriteString(this.mem, uri.AbsolutePath); if (DebugTrace.Verbose) { DebugTrace.Trace(TraceLevel.Verbose, "Wrote address path: {0} bytes", this.mem.Length); } } } DebugTrace.TraceLeave(this, "DeserializeExtended"); } static WsATv1LogEntryFlags GetPathFlags(EndpointAddress address, ProtocolVersion protocolVersion) { if (address.Uri.AbsolutePath == StandardCoordinatorAddressPath(protocolVersion)) { return WsATv1LogEntryFlags.UsesStandardCoordinatorAddressPath; } else if (address.Uri.AbsolutePath == StandardParticipantAddressPath(protocolVersion)) { return WsATv1LogEntryFlags.UsesStandardParticipantAddressPath; } else { return 0; } } static bool GetRemoteEnlistmentId(EndpointAddress address, out Guid remoteEnlistmentId) { AddressHeaderCollection refParams = address.Headers; if (refParams.Count == 1) { // We don't have to worry about catching ArgumentException here because // we already checked that there's only one header in the collection. AddressHeader refParam = refParams.FindHeader(EnlistmentHeader.HeaderName, EnlistmentHeader.HeaderNamespace); if (refParam != null) { XmlDictionaryReader reader = refParam.GetAddressHeaderReader(); using (reader) { try { ControlProtocol protocol; EnlistmentHeader.ReadFrom(reader, out remoteEnlistmentId, out protocol); return protocol == ControlProtocol.Durable2PC; } catch (InvalidEnlistmentHeaderException e) { DiagnosticUtility.ExceptionUtility.TraceHandledException(e, TraceEventType.Information); } } } } remoteEnlistmentId = Guid.Empty; return false; } } } // 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
- ObjectViewFactory.cs
- SafeFileMappingHandle.cs
- ColorInterpolationModeValidation.cs
- BufferedWebEventProvider.cs
- propertytag.cs
- XmlNodeList.cs
- QilStrConcatenator.cs
- InternalResources.cs
- UnauthorizedAccessException.cs
- ClientSettingsProvider.cs
- xmlsaver.cs
- CircleHotSpot.cs
- HttpHeaderCollection.cs
- DataGridItemAttachedStorage.cs
- BookmarkTable.cs
- ProxyWebPartManager.cs
- DataBindingHandlerAttribute.cs
- TableItemPatternIdentifiers.cs
- DummyDataSource.cs
- AliasGenerator.cs
- HTMLTextWriter.cs
- BuilderElements.cs
- XmlQualifiedNameTest.cs
- TrustDriver.cs
- BindingWorker.cs
- KeySpline.cs
- ResourceAssociationTypeEnd.cs
- RootCodeDomSerializer.cs
- FontResourceCache.cs
- TextEmbeddedObject.cs
- LocalizationCodeDomSerializer.cs
- UnionCqlBlock.cs
- DiscreteKeyFrames.cs
- ProxyGenerationError.cs
- ILGenerator.cs
- Operators.cs
- _SingleItemRequestCache.cs
- ComplexPropertyEntry.cs
- OperationFormatUse.cs
- ButtonColumn.cs
- DataGridTablesFactory.cs
- ServiceBuildProvider.cs
- BamlBinaryWriter.cs
- PrintPreviewControl.cs
- CodeArrayCreateExpression.cs
- Privilege.cs
- NumericExpr.cs
- URLIdentityPermission.cs
- PassportAuthenticationEventArgs.cs
- ColorContextHelper.cs
- XmlStrings.cs
- ContainerSelectorGlyph.cs
- TableStyle.cs
- XPathNavigatorKeyComparer.cs
- SoapElementAttribute.cs
- TextShapeableCharacters.cs
- ApplicationException.cs
- CultureMapper.cs
- MembershipPasswordException.cs
- HandlerMappingMemo.cs
- ViewSimplifier.cs
- WebScriptMetadataFormatter.cs
- DBCommandBuilder.cs
- OleDbParameterCollection.cs
- PointCollection.cs
- XmlKeywords.cs
- SerializationHelper.cs
- ProfileBuildProvider.cs
- XmlDomTextWriter.cs
- LabelEditEvent.cs
- FtpCachePolicyElement.cs
- DoWorkEventArgs.cs
- Color.cs
- ApplicationSettingsBase.cs
- ResXDataNode.cs
- TableSectionStyle.cs
- Int32Converter.cs
- Bold.cs
- CatalogPartCollection.cs
- ProjectionCamera.cs
- HyperLinkStyle.cs
- GradientBrush.cs
- CompilerResults.cs
- WebPartZoneCollection.cs
- PageThemeCodeDomTreeGenerator.cs
- DataGridItem.cs
- BindingContext.cs
- XmlDataFileEditor.cs
- _ConnectOverlappedAsyncResult.cs
- MatrixCamera.cs
- Brush.cs
- PasswordDeriveBytes.cs
- WebHttpElement.cs
- ViewValidator.cs
- OpCopier.cs
- WeakReference.cs
- File.cs
- Command.cs
- UndoUnit.cs
- WaitForChangedResult.cs