public static ReferenceCountedChannel <TChannel> GetChannel(Proxy <TChannel> proxy) { ReferenceCountedChannel <TChannel> channel; EndpointAddress to = proxy.To; ChannelMruCacheKey key = new ChannelMruCacheKey(to.Uri.AbsoluteUri, to.Identity); ChannelMruCache <TChannel> channelCache = proxy.ChannelCache; lock (channelCache) { if (channelCache.TryGetValue(key, out channel)) { channel.AddRef(); return(channel); } } TChannel local = proxy.CreateChannel(new EndpointAddress(to.Uri, to.Identity, new AddressHeader[0])); lock (channelCache) { if (!channelCache.TryGetValue(key, out channel)) { channel = new ReferenceCountedChannel <TChannel>(proxy, local, key); channelCache.Add(key, channel); } else { ((IChannel)local).Close(); } channel.AddRef(); } return(channel); }
private ReferenceCountedChannel(Proxy <TChannel> proxy, TChannel channel, ChannelMruCacheKey key) { this.proxy = proxy; this.channel = channel; this.key = key; }