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
- TreeView.cs
- QuerySelectOp.cs
- HttpModulesSection.cs
- FileDialog.cs
- WebScriptMetadataFormatter.cs
- CurrencyWrapper.cs
- GridViewItemAutomationPeer.cs
- EncoderExceptionFallback.cs
- ItemDragEvent.cs
- CodeLabeledStatement.cs
- XmlComment.cs
- ZoneLinkButton.cs
- DelegatingTypeDescriptionProvider.cs
- SQLMoneyStorage.cs
- CodeDomDesignerLoader.cs
- DiscoveryDefaults.cs
- TemplateParser.cs
- HandlerBase.cs
- FormClosedEvent.cs
- DataControlFieldHeaderCell.cs
- SqlError.cs
- SystemEvents.cs
- ImageSourceConverter.cs
- OperationAbortedException.cs
- glyphs.cs
- SkinBuilder.cs
- EdmProperty.cs
- EdmProviderManifest.cs
- TextOutput.cs
- AmbientValueAttribute.cs
- SQLMembershipProvider.cs
- Polyline.cs
- XmlDeclaration.cs
- AnimatedTypeHelpers.cs
- XmlFileEditor.cs
- TimeoutValidationAttribute.cs
- RSAPKCS1KeyExchangeFormatter.cs
- CodeCatchClauseCollection.cs
- WindowsEditBox.cs
- QueryExpression.cs
- ParallelTimeline.cs
- EntityContainerEmitter.cs
- ACL.cs
- BlockCollection.cs
- VectorCollectionValueSerializer.cs
- QuotedPairReader.cs
- Int32CollectionValueSerializer.cs
- SqlDataSourceFilteringEventArgs.cs
- HashLookup.cs
- XmlExtensionFunction.cs
- SchemaImporterExtensionElement.cs
- Int32RectConverter.cs
- CompareInfo.cs
- DataControlFieldTypeEditor.cs
- COM2PictureConverter.cs
- VariableValue.cs
- AdornerPresentationContext.cs
- TableCellCollection.cs
- CompareValidator.cs
- BooleanToSelectiveScrollingOrientationConverter.cs
- DataServiceExpressionVisitor.cs
- TypeKeyValue.cs
- SafeNativeMethods.cs
- HttpInputStream.cs
- AuthStoreRoleProvider.cs
- CodeAssignStatement.cs
- CollectionViewGroupRoot.cs
- XmlDataProvider.cs
- NamedElement.cs
- MarkerProperties.cs
- ParsedAttributeCollection.cs
- HttpCacheVaryByContentEncodings.cs
- LinkArea.cs
- BmpBitmapEncoder.cs
- GraphicsContainer.cs
- DesignerOptionService.cs
- WindowsListBox.cs
- InputLanguageProfileNotifySink.cs
- XmlRawWriter.cs
- DataObjectPastingEventArgs.cs
- BulletChrome.cs
- DataObject.cs
- DocumentPageView.cs
- RichTextBoxConstants.cs
- ProcessThread.cs
- DataControlFieldCell.cs
- DataListCommandEventArgs.cs
- RtfToXamlReader.cs
- ResourceType.cs
- ConfigXmlElement.cs
- Listbox.cs
- Dispatcher.cs
- SystemUnicastIPAddressInformation.cs
- controlskin.cs
- BrowserTree.cs
- ButtonColumn.cs
- MarkupProperty.cs
- XmlDataFileEditor.cs
- DateTimeOffsetConverter.cs
- EntityDataSourceDesigner.cs