Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Dispatcher / EndpointDispatcherTable.cs / 1 / EndpointDispatcherTable.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Dispatcher { using System.ServiceModel; using System.ServiceModel.Channels; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.ServiceModel.Diagnostics; using System.Threading; class EndpointDispatcherTable { MessageFilterTablefilters; object thisLock; const int optimizationThreshold = 2; List cachedEndpoints; public EndpointDispatcherTable(object thisLock) { this.thisLock = thisLock; } public int Count { get { return ((this.cachedEndpoints != null) ? cachedEndpoints.Count : 0) + ((this.filters != null) ? this.filters.Count : 0); } } object ThisLock { get { return thisLock; } } public void AddEndpoint(EndpointDispatcher endpoint) { lock (ThisLock) { MessageFilter filter = endpoint.EndpointFilter; int priority = endpoint.FilterPriority; if (filters == null) { if (this.cachedEndpoints == null) { this.cachedEndpoints = new List (optimizationThreshold); } if (this.cachedEndpoints.Count < optimizationThreshold) { this.cachedEndpoints.Add(endpoint); } else { filters = new MessageFilterTable (); for (int i = 0; i < this.cachedEndpoints.Count; i++) { int cachedPriority = cachedEndpoints[i].FilterPriority; MessageFilter cachedFilter = cachedEndpoints[i].EndpointFilter; filters.Add(cachedFilter, cachedEndpoints[i], cachedPriority); } filters.Add(filter, endpoint, priority); this.cachedEndpoints = null; } } else { filters.Add(filter, endpoint, priority); } } } public void RemoveEndpoint(EndpointDispatcher endpoint) { lock (ThisLock) { if (filters == null) { if (cachedEndpoints != null && cachedEndpoints.Contains(endpoint)) { cachedEndpoints.Remove(endpoint); } } else { MessageFilter filter = endpoint.EndpointFilter; filters.Remove(filter); } } } EndpointDispatcher LookupInCache(Message message, out bool addressMatched) { EndpointDispatcher result = null; int priority = int.MinValue; bool duplicatePriority = false; addressMatched = false; if (this.cachedEndpoints != null && this.cachedEndpoints.Count > 0) { for (int i = 0; i < this.cachedEndpoints.Count; i++) { EndpointDispatcher cachedEndpoint = cachedEndpoints[i]; int cachedPriority = cachedEndpoint.FilterPriority; MessageFilter cachedFilter = cachedEndpoint.EndpointFilter; bool matchResult; AndMessageFilter andFilter = cachedFilter as AndMessageFilter; if (andFilter != null) { bool addressResult; matchResult = andFilter.Match(message, out addressResult); addressMatched |= addressResult; } else { matchResult = cachedFilter.Match(message); } if (matchResult) { addressMatched = true; if (cachedPriority > priority || result == null) { result = cachedEndpoint; priority = cachedPriority; duplicatePriority = false; } else if (cachedPriority == priority && result != null) { duplicatePriority = true; } } } } if (duplicatePriority) { throw TraceUtility.ThrowHelperError(new MultipleFilterMatchesException(SR.GetString(SR.FilterMultipleMatches)), message); } return result; } public EndpointDispatcher Lookup(Message message, out bool addressMatched) { EndpointDispatcher data = null; data = LookupInCache(message, out addressMatched); if (data == null) { lock (ThisLock) { data = LookupInCache(message, out addressMatched); if (data == null && filters != null) { filters.GetMatchingValue(message, out data, out addressMatched); } } } return data; } } } // 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
- XDeferredAxisSource.cs
- HttpServerUtilityBase.cs
- EndpointDispatcherTable.cs
- COM2PropertyDescriptor.cs
- CompressionTransform.cs
- SystemPens.cs
- SafeCancelMibChangeNotify.cs
- IFlowDocumentViewer.cs
- DispatcherHookEventArgs.cs
- PropertyValueUIItem.cs
- DomainLiteralReader.cs
- DefaultValueConverter.cs
- WebBrowserNavigatedEventHandler.cs
- PermissionAttributes.cs
- SplineQuaternionKeyFrame.cs
- ClockGroup.cs
- DesignTimeData.cs
- MessageBox.cs
- FontEmbeddingManager.cs
- ProviderCommandInfoUtils.cs
- AsymmetricSignatureFormatter.cs
- AttributeProviderAttribute.cs
- X509CertificateCollection.cs
- MarkupProperty.cs
- MenuScrollingVisibilityConverter.cs
- IncrementalCompileAnalyzer.cs
- TypeGeneratedEventArgs.cs
- OdbcHandle.cs
- SchemaElementDecl.cs
- ToolStripOverflowButton.cs
- Keywords.cs
- HashAlgorithm.cs
- TimeSpanFormat.cs
- AsyncPostBackTrigger.cs
- OleDbException.cs
- WindowsImpersonationContext.cs
- XmlRootAttribute.cs
- _NegotiateClient.cs
- ResolveDuplexAsyncResult.cs
- DataDocumentXPathNavigator.cs
- FontNameEditor.cs
- NativeMethods.cs
- ContextMenu.cs
- FrameDimension.cs
- QueryExpr.cs
- HotSpotCollection.cs
- IdnElement.cs
- MD5.cs
- ConfigurationStrings.cs
- PasswordBoxAutomationPeer.cs
- AccessorTable.cs
- ConvertEvent.cs
- BrushMappingModeValidation.cs
- ArgIterator.cs
- XmlIncludeAttribute.cs
- Scanner.cs
- EventRouteFactory.cs
- FrameworkContextData.cs
- SuppressMergeCheckAttribute.cs
- SiteMapDataSourceView.cs
- ToolStripSplitButton.cs
- ContextStack.cs
- PhonemeConverter.cs
- EntitySqlException.cs
- SqlFormatter.cs
- ResourceProviderFactory.cs
- XmlStreamStore.cs
- LinkAreaEditor.cs
- TypeConverterValueSerializer.cs
- GatewayIPAddressInformationCollection.cs
- listitem.cs
- DictionarySectionHandler.cs
- RegisteredDisposeScript.cs
- SessionEndedEventArgs.cs
- DebugView.cs
- XPathSelfQuery.cs
- XmlParserContext.cs
- Base64Encoder.cs
- PropertyDescriptorCollection.cs
- TextTreeInsertUndoUnit.cs
- MembershipValidatePasswordEventArgs.cs
- GeneratedCodeAttribute.cs
- XmlSchemaDocumentation.cs
- MbpInfo.cs
- GroupByQueryOperator.cs
- MappedMetaModel.cs
- LZCodec.cs
- IdentityModelStringsVersion1.cs
- DesignerActionHeaderItem.cs
- VScrollProperties.cs
- OverlappedAsyncResult.cs
- WebPartDisplayModeCollection.cs
- AssertFilter.cs
- ModelPropertyImpl.cs
- HttpFileCollection.cs
- DataContractAttribute.cs
- SweepDirectionValidation.cs
- XmlUtil.cs
- TextRange.cs
- ZipIOModeEnforcingStream.cs