public static void UnregisterListener(LocalChannelListener listener)
 {
     lock (routingTable)
     {
         if (!routingTable.Remove(listener.Uri))
         {
             throw new InvalidOperationException(String.Format
                 (ExceptionMessages.NoListenerRegistered, listener.Uri));
         }
     }
 }
 public static void RegisterListener(LocalChannelListener listener)
 {
     LocalChannelListener listenerOut;
     lock (routingTable)
     {
         if (!routingTable.TryGetValue(listener.Uri, out listenerOut))
         {
             routingTable.Add(listener.Uri, listener);
         }
         else
         {
             throw new InvalidOperationException(String.Format
                 (ExceptionMessages.ListenerAlreadyRegistered, listener.Uri));
         }
     }
 }
        static IDuplexSessionChannel CreateServerChannel(InputQueue<Message> inputQueue,
            InputQueue<Message> outputQueue,
            EndpointAddress remoteAddress, Uri via,
            out LocalChannelListener channelListener)
        {
            lock (routingTable)
            {
                if (!routingTable.TryGetValue(via, out channelListener))
                {
                    throw new EndpointNotFoundException(String.Format
                        (ExceptionMessages.ChannelListenerNotFound, via.ToString()));
                }
            }

            return new ServerLocalDuplexSessionChannel(channelListener,
                inputQueue, outputQueue, remoteAddress, via);
        }
 internal ServerLocalDuplexSessionChannel(LocalChannelListener listener, 
     InputQueue<Message>receiveQueue, InputQueue<Message>sendQueue,
     EndpointAddress address, Uri via)
     : base(listener, receiveQueue, sendQueue, address, via)
 {
 }