Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / SMSvcHost / System / ServiceModel / Activation / RoutingTable.cs / 1 / RoutingTable.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Activation { using System; using System.Collections; using System.Security.AccessControl; using System.Diagnostics; using System.Threading; using System.ServiceModel; using System.ServiceModel.Channels; using System.Collections.Generic; using System.ServiceModel.Diagnostics; using System.ServiceModel.Activation.Diagnostics; using System.Globalization; using System.Net; using StringTraceRecord = System.ServiceModel.Diagnostics.StringTraceRecord; static class RoutingTable { class MessageQueueAndPath { MessageQueue messageQueue; Uri uri; internal MessageQueueAndPath(MessageQueue messageQueue, Uri uri) { this.messageQueue = messageQueue; this.uri = uri; } internal MessageQueue MessageQueue { get { return messageQueue; } } internal Uri Uri { get { return uri; } } } static UriPrefixTablenamedPipeMessageQueues = new UriPrefixTable (); static UriPrefixTable tcpMessageQueues = new UriPrefixTable (true); #if DEBUG internal static void DumpTables(TransportType transportType) { UriPrefixTable table = transportType == TransportType.Tcp ? tcpMessageQueues : namedPipeMessageQueues; lock (table) { Debug.Print("RoutingTable dumping " + table.Count + " Route(s) for TransportType: " + transportType); int count = 0; foreach (KeyValuePair item in table.GetAll()) { bool activated = item.Value.MessageQueue.GetType().Equals(typeof(ActivatedMessageQueue)); Debug.Print("Registration #" + (++count).ToString(CultureInfo.CurrentUICulture)); Debug.Print("\tActivated:" + activated); Debug.Print("\tCanDispatch:" + item.Value.MessageQueue.CanDispatch); Debug.Print("\tBaseAddress:" + item.Key.BaseAddress); Debug.Print("\tHostNameComparisonMode:" + item.Key.HostNameComparisonMode); List workers = item.Value.MessageQueue.SnapshotWorkers(); if (workers.Count == 0) { Debug.Print("\tNo WorkerProcess Active."); } else { Debug.Print("\t" + workers.Count + " WorkerProcess(es) Registered:"); foreach (WorkerProcess wp in workers) { Debug.Print("\t\tPid:" + wp.ProcessId); if (activated) { Debug.Print("\t\tActive:" + wp.IsRegistered); Debug.Print("\t\tQueueId:" + wp.QueueId); } } } } } } #endif internal static MessageQueue Lookup(Uri uri, IPAddress address, int port) { Uri wildCardUri = uri; UriPrefixTable table = namedPipeMessageQueues; if (address != null) { // Including port number to support TCP proxy (see MB56472). We only use it for wildcard matching below. // NOTE: we don't need to call TcpChannelListener.FixIpv6Hostname to fix the host name because it's ignored anyway. UriBuilder uriBuilder = new UriBuilder(uri.Scheme, uri.Host, port, uri.PathAndQuery); wildCardUri = uriBuilder.Uri; table = tcpMessageQueues; } MessageQueueAndPath found = null; bool success = table.TryLookupUri(wildCardUri, HostNameComparisonMode.StrongWildcard, out found); if (success && address != null) { success = ValidateAddress(address, ref found); } if (!success) { success = table.TryLookupUri(uri, HostNameComparisonMode.Exact, out found); if (success && address != null) { success = ValidateAddress(address, ref found); } } if (!success) { success = table.TryLookupUri(wildCardUri, HostNameComparisonMode.WeakWildcard, out found); if (success && address != null) { success = ValidateAddress(address, ref found); } } if (DiagnosticUtility.ShouldTraceInformation) { ListenerTraceUtility.TraceEvent(TraceEventType.Information, TraceCode.RoutingTableLookup, new StringTraceRecord("Uri", uri.ToString()), null, null); } Debug.Print("RoutingTable.Lookup(" + uri + ") matched: " + (found == null ? " " : found.Uri.ToString())); return found == null ? null : found.MessageQueue; } static bool ValidateAddress(IPAddress address, ref MessageQueueAndPath found) { if (found.Uri.HostNameType != UriHostNameType.IPv4 && found.Uri.HostNameType != UriHostNameType.IPv6) { return true; } IPAddress foundAddress = IPAddress.Parse(found.Uri.DnsSafeHost); bool valid = (address.Equals(foundAddress) || (foundAddress.Equals(IPAddress.Any) && foundAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) || foundAddress.Equals(IPAddress.IPv6Any)); found = valid ? found : null; return valid; } internal static ListenerExceptionStatus NamedPipeStart(MessageQueue messageQueue, BaseUriWithWildcard path) { int encodedSize = System.Text.Encoding.UTF8.GetByteCount(path.BaseAddress.AbsoluteUri); if (encodedSize > ListenerConstants.MaxUriSize) { if (DiagnosticUtility.ShouldTraceInformation) { ListenerTraceUtility.TraceEvent(TraceEventType.Information, TraceCode.RoutingTablePathTooLong, new StringTraceRecord("Path", path.ToString()), null, null); } return ListenerExceptionStatus.PathTooLong; } lock (namedPipeMessageQueues) { if (namedPipeMessageQueues.IsRegistered(path)) { if (DiagnosticUtility.ShouldTraceInformation) { ListenerTraceUtility.TraceEvent(TraceEventType.Information, TraceCode.RoutingTableNamespaceConflict, new StringTraceRecord("Path", path.ToString()), null, null); } return ListenerExceptionStatus.ConflictingRegistration; } TransportListener.Listen(path); namedPipeMessageQueues.RegisterUri(path.BaseAddress, path.HostNameComparisonMode, new MessageQueueAndPath(messageQueue, path.BaseAddress)); } if (DiagnosticUtility.ShouldTraceInformation) { ListenerTraceUtility.TraceEvent(TraceEventType.Information, TraceCode.RoutingTableRegisterSuccess, new StringTraceRecord("Path", path.ToString()), null, null); } return ListenerExceptionStatus.Success; } internal static ListenerExceptionStatus Start(MessageQueue messageQueue, BaseUriWithWildcard path) { if (messageQueue.TransportType == TransportType.Tcp) { return TcpStart(messageQueue, path); } else { return NamedPipeStart(messageQueue, path); } } static IPEndPoint GetEndPoint(Uri path) { IPAddress address = IPAddress.Broadcast; if (path.HostNameType == UriHostNameType.IPv4 || path.HostNameType == UriHostNameType.IPv6) { address = IPAddress.Parse(path.DnsSafeHost); } return new IPEndPoint(address, path.Port); } internal static void Stop(MessageQueue messageQueue, BaseUriWithWildcard path) { if (messageQueue.TransportType == TransportType.Tcp) { IPEndPoint endPoint = GetEndPoint(path.BaseAddress); TransportListener.Stop(endPoint); tcpMessageQueues.UnregisterUri(path.BaseAddress, path.HostNameComparisonMode); } else { TransportListener.Stop(path); namedPipeMessageQueues.UnregisterUri(path.BaseAddress, path.HostNameComparisonMode); } } static ListenerExceptionStatus TcpStart(MessageQueue messageQueue, BaseUriWithWildcard path) { int encodedSize = System.Text.Encoding.UTF8.GetByteCount(path.BaseAddress.AbsoluteUri); if (encodedSize > ListenerConstants.MaxUriSize) { if (DiagnosticUtility.ShouldTraceInformation) { ListenerTraceUtility.TraceEvent(TraceEventType.Information, TraceCode.RoutingTablePathTooLong, new StringTraceRecord("Path", path.ToString()), null, null); } return ListenerExceptionStatus.PathTooLong; } IPEndPoint endPoint = GetEndPoint(path.BaseAddress); lock (tcpMessageQueues) { if (tcpMessageQueues.IsRegistered(path)) { if (DiagnosticUtility.ShouldTraceInformation) { ListenerTraceUtility.TraceEvent(TraceEventType.Information, TraceCode.RoutingTableNamespaceConflict, new StringTraceRecord("Path", path.ToString()), null, null); } return ListenerExceptionStatus.ConflictingRegistration; } TransportListener.Listen(endPoint); tcpMessageQueues.RegisterUri(path.BaseAddress, path.HostNameComparisonMode, new MessageQueueAndPath(messageQueue, path.BaseAddress)); } if (DiagnosticUtility.ShouldTraceInformation) { ListenerTraceUtility.TraceEvent(TraceEventType.Information, TraceCode.RoutingTableRegisterSuccess, new StringTraceRecord("Path", path.ToString()), null, null); } return ListenerExceptionStatus.Success; } } } // 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
- CompilerCollection.cs
- Attributes.cs
- DesignerSerializationVisibilityAttribute.cs
- FlowDocumentPage.cs
- RadioButton.cs
- Volatile.cs
- recordstatescratchpad.cs
- CachedCompositeFamily.cs
- DataServiceQueryProvider.cs
- Facet.cs
- NativeObjectSecurity.cs
- ScriptServiceAttribute.cs
- InfoCardServiceInstallComponent.cs
- ExpanderAutomationPeer.cs
- ServiceOperationDetailViewControl.cs
- EditorPartChrome.cs
- HttpProfileBase.cs
- NameSpaceExtractor.cs
- ToolStripContainer.cs
- Label.cs
- Comparer.cs
- ErrorFormatter.cs
- SafeArchiveContext.cs
- Types.cs
- SystemIPInterfaceStatistics.cs
- FrugalMap.cs
- ExpanderAutomationPeer.cs
- HostedHttpContext.cs
- DataBinder.cs
- HuffmanTree.cs
- VerticalAlignConverter.cs
- GridViewColumnCollectionChangedEventArgs.cs
- SoundPlayer.cs
- MetafileHeader.cs
- TdsParserStateObject.cs
- XmlResolver.cs
- CodeMemberEvent.cs
- Code.cs
- TrackingLocation.cs
- SqlClientFactory.cs
- HostingEnvironmentWrapper.cs
- RepeaterItemCollection.cs
- OleServicesContext.cs
- DecimalConstantAttribute.cs
- ProjectionNode.cs
- PropertyIDSet.cs
- SimpleBitVector32.cs
- ResourcePermissionBase.cs
- DesignerDeviceConfig.cs
- ImageAutomationPeer.cs
- XmlCDATASection.cs
- AspNetSynchronizationContext.cs
- NamespaceList.cs
- ReflectionUtil.cs
- QuaternionRotation3D.cs
- TreeIterator.cs
- TableHeaderCell.cs
- SqlTransaction.cs
- ResXBuildProvider.cs
- Simplifier.cs
- DataTransferEventArgs.cs
- FormsAuthentication.cs
- BitmapMetadata.cs
- XdrBuilder.cs
- GridViewEditEventArgs.cs
- GeneralTransform.cs
- ByteConverter.cs
- ReadOnlyMetadataCollection.cs
- DataReaderContainer.cs
- PeerNameRecordCollection.cs
- WebChannelFactory.cs
- IndentTextWriter.cs
- SchemaTableOptionalColumn.cs
- ShaperBuffers.cs
- NotSupportedException.cs
- BindMarkupExtensionSerializer.cs
- PropertyPath.cs
- ZipIOExtraFieldPaddingElement.cs
- ComAdminInterfaces.cs
- Parameter.cs
- AutomationElementIdentifiers.cs
- DataSourceHelper.cs
- ServiceDescriptions.cs
- PreviewPageInfo.cs
- _BaseOverlappedAsyncResult.cs
- RelationalExpressions.cs
- XmlTextAttribute.cs
- ConsoleKeyInfo.cs
- ContextMenuService.cs
- RelativeSource.cs
- BrowserInteropHelper.cs
- XPathQilFactory.cs
- SettingsPropertyValueCollection.cs
- DropShadowBitmapEffect.cs
- DesignerDataTable.cs
- ManipulationBoundaryFeedbackEventArgs.cs
- Border.cs
- ActivityExecutionContextCollection.cs
- PeerResolver.cs
- SrgsToken.cs