Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / RequestReplyCorrelator.cs / 1 / RequestReplyCorrelator.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System.Collections; using System.ServiceModel; using System.Collections.Generic; using System.Xml; using System.ServiceModel.Diagnostics; class RequestReplyCorrelator : IRequestReplyCorrelator { Hashtable states; internal RequestReplyCorrelator() { this.states = new Hashtable(); } void IRequestReplyCorrelator.Add(Message request, T state) { UniqueId messageId = request.Headers.MessageId; Type stateType = typeof(T); Key key = new Key(messageId, stateType); lock (states) { states.Add(key, state); } } T IRequestReplyCorrelator.Find (Message reply, bool remove) { UniqueId relatesTo = GetRelatesTo(reply); Type stateType = typeof(T); Key key = new Key(relatesTo, stateType); T value; lock (states) { value = (T)states[key]; if (remove) states.Remove(key); } return value; } UniqueId GetRelatesTo(Message reply) { UniqueId relatesTo = reply.Headers.RelatesTo; if (relatesTo == null) throw TraceUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SuppliedMessageIsNotAReplyItHasNoRelatesTo0)), reply); return relatesTo; } internal static bool AddressReply(Message reply, Message request) { ReplyToInfo info = RequestReplyCorrelator.ExtractReplyToInfo(request); return RequestReplyCorrelator.AddressReply(reply, info); } internal static bool AddressReply(Message reply, ReplyToInfo info) { EndpointAddress destination = null; if (info.HasFaultTo && (reply.IsFault)) { destination = info.FaultTo; } else if (info.HasReplyTo) { destination = info.ReplyTo; } else if (reply.Version.Addressing == AddressingVersion.WSAddressingAugust2004) { if (info.HasFrom) { destination = info.From; } else { destination = EndpointAddress.AnonymousAddress; } } if (destination != null) { destination.ApplyTo(reply); return !destination.IsNone; } else { return true; } } internal static ReplyToInfo ExtractReplyToInfo(Message message) { return new ReplyToInfo(message); } internal static void PrepareRequest(Message request) { MessageHeaders requestHeaders = request.Headers; if (requestHeaders.MessageId == null) { requestHeaders.MessageId = new UniqueId(); } request.Properties.AllowOutputBatching = false; if (TraceUtility.PropagateUserActivity || TraceUtility.ShouldPropagateActivity) { TraceUtility.AddAmbientActivityToMessage(request); } } internal static void PrepareReply(Message reply, UniqueId messageId) { if (object.ReferenceEquals(messageId, null)) throw TraceUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MissingMessageID)), reply); MessageHeaders replyHeaders = reply.Headers; if (object.ReferenceEquals(replyHeaders.RelatesTo, null)) { replyHeaders.RelatesTo = messageId; } if (TraceUtility.PropagateUserActivity || TraceUtility.ShouldPropagateActivity) { TraceUtility.AddAmbientActivityToMessage(reply); } } internal static void PrepareReply(Message reply, Message request) { UniqueId messageId = request.Headers.MessageId; if (messageId != null) { MessageHeaders replyHeaders = reply.Headers; if (object.ReferenceEquals(replyHeaders.RelatesTo, null)) { replyHeaders.RelatesTo = messageId; } } if (TraceUtility.PropagateUserActivity || TraceUtility.ShouldPropagateActivity) { TraceUtility.AddAmbientActivityToMessage(reply); } } internal struct ReplyToInfo { readonly EndpointAddress faultTo; readonly EndpointAddress from; readonly EndpointAddress replyTo; internal ReplyToInfo(Message message) { this.faultTo = message.Headers.FaultTo; this.replyTo = message.Headers.ReplyTo; if (message.Version.Addressing == AddressingVersion.WSAddressingAugust2004) { this.from = message.Headers.From; } else { this.from = null; } } internal EndpointAddress FaultTo { get { return this.faultTo; } } internal EndpointAddress From { get { return this.from; } } internal bool HasFaultTo { get { return !IsTrivial(this.FaultTo); } } internal bool HasFrom { get { return !IsTrivial(this.From); } } internal bool HasReplyTo { get { return !IsTrivial(this.ReplyTo); } } internal EndpointAddress ReplyTo { get { return this.replyTo; } } bool IsTrivial(EndpointAddress address) { // Note: even if address.IsAnonymous, it may have identity, reference parameters, etc. return (address == null) || (address==EndpointAddress.AnonymousAddress); } } class Key { internal UniqueId MessageId; internal Type StateType; internal Key(UniqueId messageId, Type stateType) { MessageId = messageId; StateType = stateType; } public override bool Equals(object obj) { Key other = obj as Key; if (other == null) return false; return other.MessageId == this.MessageId && other.StateType == this.StateType; } public override int GetHashCode() { return MessageId.GetHashCode() ^ StateType.GetHashCode(); } public override string ToString() { return typeof(Key).ToString() + ": {" + MessageId + ", " + StateType.ToString() + "}"; } } } } // 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
- _Events.cs
- DataErrorValidationRule.cs
- OdbcConnectionString.cs
- ObjectPersistData.cs
- TransformGroup.cs
- Keyboard.cs
- PeerContact.cs
- EventProviderWriter.cs
- ServerProtocol.cs
- ParameterElementCollection.cs
- AddInToken.cs
- PageCatalogPart.cs
- CellQuery.cs
- TcpConnectionPool.cs
- FixedNode.cs
- HTMLTagNameToTypeMapper.cs
- ControlsConfig.cs
- ZoneButton.cs
- SqlRemoveConstantOrderBy.cs
- FixedSOMTableCell.cs
- formatter.cs
- ApplicationFileParser.cs
- BindingSourceDesigner.cs
- TraceSource.cs
- ComplexLine.cs
- MSAAWinEventWrap.cs
- XamlHostingSectionGroup.cs
- SqlServer2KCompatibilityAnnotation.cs
- SocketElement.cs
- ObjectStateEntryOriginalDbUpdatableDataRecord.cs
- SecureConversationServiceElement.cs
- DbConnectionPool.cs
- UnmanagedMemoryStreamWrapper.cs
- ParameterBuilder.cs
- datacache.cs
- RuleRef.cs
- ValidationEventArgs.cs
- ExpressionVisitor.cs
- LiteralTextContainerControlBuilder.cs
- DbProviderSpecificTypePropertyAttribute.cs
- ConstraintStruct.cs
- WebPartManager.cs
- HelpEvent.cs
- ProfessionalColorTable.cs
- ContextMenuAutomationPeer.cs
- counter.cs
- CodeCatchClauseCollection.cs
- XmlWriterDelegator.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- HiddenFieldPageStatePersister.cs
- CodeAccessSecurityEngine.cs
- SystemResources.cs
- SmtpSection.cs
- ExpressionParser.cs
- EndpointDiscoveryElement.cs
- DrawingAttributeSerializer.cs
- SqlXmlStorage.cs
- NestedContainer.cs
- ClientSideQueueItem.cs
- CallbackHandler.cs
- XPathItem.cs
- Utility.cs
- FacetChecker.cs
- UnauthorizedWebPart.cs
- MessageFilterTable.cs
- ObjectList.cs
- NonceCache.cs
- LongTypeConverter.cs
- ScrollProperties.cs
- NamedElement.cs
- XmlSchemaParticle.cs
- CorrelationManager.cs
- DataView.cs
- ConnectionManagementElement.cs
- SynchronizedDispatch.cs
- XPathNode.cs
- DocumentOrderComparer.cs
- Int64AnimationUsingKeyFrames.cs
- SelectionManager.cs
- BaseCodeDomTreeGenerator.cs
- XmlParserContext.cs
- BackEase.cs
- SchemaTableColumn.cs
- HandleValueEditor.cs
- DataServiceRequest.cs
- LayoutTableCell.cs
- ResolvedKeyFrameEntry.cs
- PnrpPermission.cs
- ContextMenuService.cs
- RegionInfo.cs
- AnimationTimeline.cs
- OpCellTreeNode.cs
- RMPermissions.cs
- HandlerFactoryWrapper.cs
- BasicExpressionVisitor.cs
- IntersectQueryOperator.cs
- JulianCalendar.cs
- DriveInfo.cs
- BaseTreeIterator.cs
- AudioDeviceOut.cs