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
- DefaultAuthorizationContext.cs
- RegexTree.cs
- ParserStreamGeometryContext.cs
- ClientRuntimeConfig.cs
- DeferredSelectedIndexReference.cs
- DateTimeConstantAttribute.cs
- ActionItem.cs
- EncodingInfo.cs
- VisualBasic.cs
- ObjectSet.cs
- entityreference_tresulttype.cs
- DataGridRowDetailsEventArgs.cs
- BufferModeSettings.cs
- PageContentAsyncResult.cs
- ExtensionQuery.cs
- SelectionRange.cs
- QuestionEventArgs.cs
- ResourceExpressionBuilder.cs
- BufferAllocator.cs
- SqlClientMetaDataCollectionNames.cs
- UInt32Storage.cs
- OracleColumn.cs
- SqlParameterizer.cs
- IProvider.cs
- VersionedStreamOwner.cs
- XhtmlBasicPanelAdapter.cs
- Transform.cs
- XamlReader.cs
- EventDescriptor.cs
- UTF8Encoding.cs
- ResourcesBuildProvider.cs
- ScriptModule.cs
- DataSourceXmlSerializationAttribute.cs
- VariableAction.cs
- InlineCollection.cs
- XAMLParseException.cs
- XmlDataProvider.cs
- SqlComparer.cs
- NopReturnReader.cs
- TrackingStringDictionary.cs
- WindowsFormsSectionHandler.cs
- VirtualizedContainerService.cs
- MembershipPasswordException.cs
- SafeNativeMethods.cs
- TextSelection.cs
- DSACryptoServiceProvider.cs
- NamedPipeChannelFactory.cs
- DataServiceClientException.cs
- Normalizer.cs
- SaveWorkflowCommand.cs
- Setter.cs
- ThreadStaticAttribute.cs
- OdbcHandle.cs
- RtfToXamlReader.cs
- ConvertersCollection.cs
- ContractCodeDomInfo.cs
- InputProcessorProfilesLoader.cs
- UIPropertyMetadata.cs
- DataGridHelper.cs
- SafeSecurityHelper.cs
- StreamUpdate.cs
- EndpointAddressMessageFilterTable.cs
- VisualStates.cs
- ScriptingProfileServiceSection.cs
- ConfigXmlElement.cs
- AssemblyHash.cs
- OdbcCommand.cs
- WindowsListViewGroupSubsetLink.cs
- MimeXmlImporter.cs
- PingOptions.cs
- KnownTypesHelper.cs
- OdbcFactory.cs
- DerivedKeyCachingSecurityTokenSerializer.cs
- DispatchChannelSink.cs
- OleDbDataReader.cs
- RuleConditionDialog.Designer.cs
- OrderByQueryOptionExpression.cs
- CalendarAutoFormat.cs
- StyleBamlTreeBuilder.cs
- MethodAccessException.cs
- BoolExpressionVisitors.cs
- SerialErrors.cs
- TopClause.cs
- BinaryObjectWriter.cs
- SimpleTypeResolver.cs
- CodeNamespaceCollection.cs
- ValidationSummary.cs
- WebContext.cs
- InputProcessorProfilesLoader.cs
- CookieProtection.cs
- PersonalizationStateInfo.cs
- XmlEncodedRawTextWriter.cs
- TextLineResult.cs
- Grid.cs
- OracleDataAdapter.cs
- XhtmlBasicValidatorAdapter.cs
- SignatureHelper.cs
- LayoutEvent.cs
- UnionCqlBlock.cs
- ModifierKeysConverter.cs