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
- DetailsViewCommandEventArgs.cs
- WorkflowQueueInfo.cs
- ActiveXHelper.cs
- FindCriteriaElement.cs
- ToolStripItemBehavior.cs
- SelectionEditor.cs
- ColumnWidthChangingEvent.cs
- Point3D.cs
- Enlistment.cs
- Socket.cs
- XmlBoundElement.cs
- VarRefManager.cs
- OptimalBreakSession.cs
- URLMembershipCondition.cs
- HttpSocketManager.cs
- TypedElement.cs
- ConstructorNeedsTagAttribute.cs
- ListMarkerLine.cs
- NamespaceEmitter.cs
- TraceHandler.cs
- securestring.cs
- Parser.cs
- InvokePattern.cs
- safex509handles.cs
- ContextMarshalException.cs
- ArcSegment.cs
- BooleanToVisibilityConverter.cs
- ListDictionaryInternal.cs
- ListBox.cs
- AccessText.cs
- PerfProviderCollection.cs
- MetadataWorkspace.cs
- RootProfilePropertySettingsCollection.cs
- Utils.cs
- HttpHostedTransportConfiguration.cs
- WebPartDescriptionCollection.cs
- WinFormsUtils.cs
- DataControlFieldCollection.cs
- ConcurrentStack.cs
- DbXmlEnabledProviderManifest.cs
- TerminateSequence.cs
- FormViewPageEventArgs.cs
- _OSSOCK.cs
- TokenBasedSet.cs
- ExpressionConverter.cs
- ProviderConnectionPointCollection.cs
- Label.cs
- SqlFileStream.cs
- HeaderUtility.cs
- GenerateTemporaryTargetAssembly.cs
- CheckableControlBaseAdapter.cs
- DynamicEntity.cs
- RuntimeHandles.cs
- TraceSwitch.cs
- CompilerErrorCollection.cs
- MatchAttribute.cs
- Serialization.cs
- ParallelTimeline.cs
- DatePicker.cs
- ChangeConflicts.cs
- SessionParameter.cs
- ADMembershipUser.cs
- Cursors.cs
- WindowsTab.cs
- DesignerCategoryAttribute.cs
- ExpressionBuilderContext.cs
- MessageOperationFormatter.cs
- DbDataReader.cs
- Misc.cs
- StaticTextPointer.cs
- ChangeConflicts.cs
- SQLDateTime.cs
- FreezableOperations.cs
- XmlMtomReader.cs
- ApplicationManager.cs
- CallContext.cs
- CngAlgorithm.cs
- UpdateExpressionVisitor.cs
- ExternalException.cs
- NetTcpSecurityElement.cs
- ActiveXContainer.cs
- ListViewAutomationPeer.cs
- WeakHashtable.cs
- HttpProxyCredentialType.cs
- ListView.cs
- COM2ColorConverter.cs
- AddInContractAttribute.cs
- Delay.cs
- FormatterConverter.cs
- SqlClientFactory.cs
- LayoutEditorPart.cs
- OdbcConnectionFactory.cs
- Baml2006Reader.cs
- ResXResourceReader.cs
- MemberPathMap.cs
- FilterableAttribute.cs
- FormsAuthenticationConfiguration.cs
- Pool.cs
- PartialCachingAttribute.cs
- Storyboard.cs