Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / TransactionBridge / Microsoft / Transactions / Wsat / InputOutput / Completion.cs / 1 / Completion.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- // This file implements completion-related messaging using System; using System.Diagnostics; using System.IdentityModel.Claims; using System.IdentityModel.Policy; using System.ServiceModel; using System.ServiceModel.Channels; using System.Xml; using Microsoft.Transactions.Wsat.InputOutput; using Microsoft.Transactions.Wsat.Messaging; using Microsoft.Transactions.Wsat.Protocol; using Microsoft.Transactions.Wsat.StateMachines; using DiagnosticUtility = Microsoft.Transactions.Bridge.DiagnosticUtility; using Fault = Microsoft.Transactions.Wsat.Messaging.Fault; namespace Microsoft.Transactions.Wsat.InputOutput { class CompletionCoordinator : ICompletionCoordinator { ProtocolState state; AsyncCallback sendComplete; AsyncCallback politeSendComplete; public CompletionCoordinator(ProtocolState state) { this.state = state; this.sendComplete = DiagnosticUtility.ThunkAsyncCallback(new AsyncCallback(SendComplete)); this.politeSendComplete = DiagnosticUtility.ThunkAsyncCallback(new AsyncCallback(PoliteSendComplete)); } // // ICompletionCoordinator // CompletionEnlistment CheckMessage(Message message, bool reply) { Guid enlistmentId; if (!Ports.TryGetEnlistment(message, out enlistmentId)) { DebugTrace.Trace(TraceLevel.Warning, "Could not read enlistment header from message"); if (reply) this.SendFault(message, this.state.Faults.InvalidParameters); return null; } TransactionEnlistment enlistment = state.Lookup.FindEnlistment(enlistmentId); if (enlistment == null) { DebugTrace.Trace(TraceLevel.Warning, "Could not find enlistment {0}", enlistmentId); if (reply) this.SendFault(message, this.state.Faults.InvalidState); return null; } CompletionEnlistment completion = enlistment as CompletionEnlistment; if (completion == null) { DebugTrace.Trace(TraceLevel.Warning, "Completion message received for non-completion enlistment {0}", enlistmentId); if (reply) this.SendFault(message, this.state.Faults.InvalidParameters); return null; } if (!state.Service.Security.CheckIdentity(completion.ParticipantProxy, message)) { if (EnlistmentIdentityCheckFailedRecord.ShouldTrace) { EnlistmentIdentityCheckFailedRecord.Trace(completion.EnlistmentId); } // no fault reply is sent in order to replicate the security // infrastructure behavior - see MB55336 return null; } return completion; } public void Commit(Message message) { CompletionEnlistment completion = CheckMessage(message, true); if (completion != null) { completion.StateMachine.Enqueue(new MsgCompletionCommitEvent(completion)); } } public void Rollback(Message message) { CompletionEnlistment completion = CheckMessage(message, true); if (completion != null) { completion.StateMachine.Enqueue(new MsgCompletionRollbackEvent(completion)); } } public void Fault(Message message, MessageFault fault) { CompletionEnlistment completion = CheckMessage(message, false); if (completion != null) { state.Perf.FaultsReceivedCountPerInterval.Increment(); } if (DebugTrace.Info) { DebugTrace.Trace(TraceLevel.Info, "Ignoring {0} fault from completion participant at {1}: {2}", Library.GetFaultCodeName(fault), Ports.TryGetFromAddress(message), Library.GetFaultCodeReason(fault)); } } // // Sending messages // void SendComplete(IAsyncResult ar) { if (!ar.CompletedSynchronously) { CompletionEnlistment completion = (CompletionEnlistment) ar.AsyncState; OnSendComplete(ar, completion, completion.ParticipantProxy); } } void PoliteSendComplete(IAsyncResult ar) { if (!ar.CompletedSynchronously) { CompletionParticipantProxy proxy = (CompletionParticipantProxy) ar.AsyncState; OnSendComplete(ar, null, proxy); } } void OnSendComplete(IAsyncResult ar, CompletionEnlistment completion, CompletionParticipantProxy proxy) { try { proxy.EndSendMessage(ar); } catch(WsatSendFailureException e) { DiagnosticUtility.ExceptionUtility.TraceHandledException(e, TraceEventType.Warning); state.Perf.MessageSendFailureCountPerInterval.Increment(); if (completion != null) { // Don't bother to enqueue a send failure. The completion state machine doesn't care DebugTrace.TraceSendFailure(completion.EnlistmentId, e); } else { DebugTrace.TraceSendFailure(e); } } } // // Messages // public void SendCommitted(CompletionEnlistment completion) { if (DebugTrace.Info) { DebugTrace.TxTrace( TraceLevel.Info, completion.EnlistmentId, "Sending Committed to completion participant at {0}", Ports.TryGetAddress(completion.ParticipantProxy)); } IAsyncResult ar = completion.ParticipantProxy.BeginSendCommitted(this.sendComplete, completion); if (ar.CompletedSynchronously) { OnSendComplete(ar, completion, completion.ParticipantProxy); } } public void SendCommitted(EndpointAddress sendTo) { if (sendTo != null) { CompletionParticipantProxy proxy = state.TryCreateCompletionParticipantProxy(sendTo); if (proxy != null) { try { if (DebugTrace.Info) { DebugTrace.Trace(TraceLevel.Info, "Sending Committed to unrecognized completion participant at {0}", Ports.TryGetAddress(proxy)); } IAsyncResult ar = proxy.BeginSendCommitted(this.politeSendComplete, proxy); if (ar.CompletedSynchronously) { OnSendComplete(ar, null, proxy); } } finally { proxy.Release(); } } } } public void SendAborted(CompletionEnlistment completion) { if (DebugTrace.Info) { DebugTrace.TxTrace( TraceLevel.Info, completion.EnlistmentId, "Sending Aborted to completion participant at {0}", Ports.TryGetAddress(completion.ParticipantProxy)); } IAsyncResult ar = completion.ParticipantProxy.BeginSendAborted(this.sendComplete, completion); if (ar.CompletedSynchronously) { OnSendComplete(ar, completion, completion.ParticipantProxy); } } public void SendAborted(EndpointAddress sendTo) { if (sendTo != null) { CompletionParticipantProxy proxy = state.TryCreateCompletionParticipantProxy(sendTo); if (proxy != null) { try { if (DebugTrace.Info) { DebugTrace.Trace(TraceLevel.Info, "Sending Aborted to unrecognized completion participant at {0}", Ports.TryGetAddress(proxy)); } IAsyncResult ar = proxy.BeginSendAborted(this.politeSendComplete, proxy); if (ar.CompletedSynchronously) { OnSendComplete(ar, null, proxy); } } finally { proxy.Release(); } } } } void SendFault(Message message, Fault fault) { SendFault(Library.GetFaultToHeader(message.Headers, this.state.ProtocolVersion), message.Headers.MessageId, fault); } public void SendFault(EndpointAddress faultTo, UniqueId messageID, Fault fault) { if (faultTo != null) { state.FaultSender.TrySendCompletionParticipantFault(faultTo, messageID, fault); } } } } // 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
- DependencyPropertyAttribute.cs
- WebPartZoneAutoFormat.cs
- HttpListenerException.cs
- ReflectEventDescriptor.cs
- CTreeGenerator.cs
- UnsafeNativeMethods.cs
- ConfigurationErrorsException.cs
- ChildrenQuery.cs
- WeakReadOnlyCollection.cs
- GetPageCompletedEventArgs.cs
- EntityDataSourceWizardForm.cs
- XmlSerializableWriter.cs
- PolicyAssertionCollection.cs
- Roles.cs
- XmlSchemas.cs
- clipboard.cs
- TrackBar.cs
- RegexGroup.cs
- SingleBodyParameterMessageFormatter.cs
- PointConverter.cs
- HostedTcpTransportManager.cs
- FlowchartSizeFeature.cs
- StylusButtonEventArgs.cs
- TraceContextEventArgs.cs
- SqlBuilder.cs
- TdsParserStateObject.cs
- SignedXml.cs
- AccessibilityHelperForVista.cs
- AuthenticationService.cs
- ICspAsymmetricAlgorithm.cs
- DeclarativeCatalogPart.cs
- Listbox.cs
- NegotiationTokenAuthenticatorStateCache.cs
- Metafile.cs
- CompilerScope.cs
- TextTreeInsertElementUndoUnit.cs
- WizardForm.cs
- CodeTypeDelegate.cs
- Bits.cs
- KeyboardInputProviderAcquireFocusEventArgs.cs
- ViewBase.cs
- PrintPageEvent.cs
- HotSpot.cs
- CryptoProvider.cs
- ExtensionSimplifierMarkupObject.cs
- StaticDataManager.cs
- BitmapEffectGeneralTransform.cs
- SyntaxCheck.cs
- StrokeIntersection.cs
- SocketElement.cs
- FormsAuthenticationCredentials.cs
- MatrixIndependentAnimationStorage.cs
- PackageDocument.cs
- SQLDouble.cs
- IPAddressCollection.cs
- DataGridViewCellToolTipTextNeededEventArgs.cs
- ResourceSetExpression.cs
- AgileSafeNativeMemoryHandle.cs
- SizeIndependentAnimationStorage.cs
- DataGridViewCellStyle.cs
- CalendarDesigner.cs
- CodeFieldReferenceExpression.cs
- PageAdapter.cs
- BufferModesCollection.cs
- ProvidersHelper.cs
- ListViewDeletedEventArgs.cs
- XsltConvert.cs
- InstallerTypeAttribute.cs
- BulletChrome.cs
- HttpHeaderCollection.cs
- FixUpCollection.cs
- BamlResourceContent.cs
- SQLGuidStorage.cs
- Membership.cs
- ObjectStateEntry.cs
- XmlWrappingWriter.cs
- ClientSponsor.cs
- SerializationIncompleteException.cs
- SudsParser.cs
- DockEditor.cs
- TextTrailingWordEllipsis.cs
- MemberAccessException.cs
- RectAnimationBase.cs
- SQLDoubleStorage.cs
- DataGridViewBand.cs
- XDeferredAxisSource.cs
- BamlRecords.cs
- AddInPipelineAttributes.cs
- VirtualPathUtility.cs
- SafeNativeMethods.cs
- ToolStripItemImageRenderEventArgs.cs
- KnownTypeAttribute.cs
- MetafileEditor.cs
- CommentEmitter.cs
- DataPager.cs
- GlyphCollection.cs
- RowUpdatingEventArgs.cs
- OutputCacheSettingsSection.cs
- BinaryFormatter.cs
- TwoPhaseCommit.cs