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
- WebPartEditVerb.cs
- AnchorEditor.cs
- Rect3D.cs
- PkcsMisc.cs
- DataKeyCollection.cs
- SspiWrapper.cs
- XmlTextReader.cs
- TextSelectionProcessor.cs
- DocumentGridContextMenu.cs
- LineInfo.cs
- MemberNameValidator.cs
- ArrayMergeHelper.cs
- ButtonBase.cs
- BitmapEffectInputData.cs
- ProcessHostConfigUtils.cs
- bidPrivateBase.cs
- SocketPermission.cs
- WebControlsSection.cs
- HebrewNumber.cs
- InkPresenterAutomationPeer.cs
- PersonalizationProviderCollection.cs
- InlineCollection.cs
- CodeLinePragma.cs
- FixedSOMLineRanges.cs
- processwaithandle.cs
- SequentialOutput.cs
- SqlCacheDependencyDatabaseCollection.cs
- HttpEncoder.cs
- XmlnsCache.cs
- FontCacheLogic.cs
- OdbcUtils.cs
- WebDescriptionAttribute.cs
- EditingCoordinator.cs
- MimePart.cs
- BufferedGraphicsManager.cs
- SafeCertificateContext.cs
- SoapSchemaMember.cs
- CssClassPropertyAttribute.cs
- HtmlTernaryTree.cs
- HandleCollector.cs
- EntityDataSourceStatementEditor.cs
- WSSecurityOneDotZeroReceiveSecurityHeader.cs
- _ConnectionGroup.cs
- IODescriptionAttribute.cs
- SoapExtensionStream.cs
- VarRemapper.cs
- HwndMouseInputProvider.cs
- ConditionalAttribute.cs
- MethodMessage.cs
- MessagePropertyDescriptionCollection.cs
- TimeZoneNotFoundException.cs
- DependencyPropertyAttribute.cs
- WebResourceAttribute.cs
- versioninfo.cs
- ServiceAppDomainAssociationProvider.cs
- ContextInformation.cs
- _UncName.cs
- CookieProtection.cs
- ListSortDescriptionCollection.cs
- GridEntryCollection.cs
- TrackingExtract.cs
- ApplicationFileParser.cs
- MonthCalendar.cs
- SqlDuplicator.cs
- XmlImplementation.cs
- MSHTMLHost.cs
- MailBnfHelper.cs
- TraceHwndHost.cs
- CompatibleIComparer.cs
- PrintController.cs
- VirtualPathUtility.cs
- Regex.cs
- LocalizableResourceBuilder.cs
- EntityKeyElement.cs
- DoubleCollectionValueSerializer.cs
- COM2PropertyDescriptor.cs
- SiteMapProvider.cs
- DrawingContext.cs
- UIElementCollection.cs
- unsafenativemethodstextservices.cs
- SQLInt16Storage.cs
- SettingsBase.cs
- WindowsEditBox.cs
- BrushValueSerializer.cs
- CheckedPointers.cs
- DataGridTable.cs
- Vector3DAnimationBase.cs
- PassportAuthentication.cs
- StartFileNameEditor.cs
- BitmapEffectInput.cs
- IgnoreDeviceFilterElementCollection.cs
- ApplicationBuildProvider.cs
- ColumnMapTranslator.cs
- RectAnimationClockResource.cs
- XPathSelectionIterator.cs
- CodeArrayIndexerExpression.cs
- ConditionalBranch.cs
- DataGridViewHeaderCell.cs
- TimeoutException.cs
- SystemNetHelpers.cs