Как программно получить привязку, используемую прокси-сервером клиента?
У меня есть прокси-сервер WCF, созданный во время выполнения с помощью DuplexChannelFactory.
Как я могу получить доступ к информации привязки, заданной только служебным интерфейсом, возвращенным из DuplexChannelFactory?
Я могу получить большую часть материала, бросив его в IClientChannel, но я не могу найти там информацию о привязке. Самое близкое, что я могу получить, - это IClientChannel.RemoteAddress, который является конечной точкой, но, похоже, также не имеет информации о привязке. :- /
1 ответ:
Вы не можете (напрямую). Есть несколько вещей, которые вы можете получить от канала, таких как версия сообщения (
channel.GetProperty<MessageVersion>()
) и другие значения. Но привязка не из таких. Канал создается после того, как привязка "деконструирована" (т. е. расширена в его элементы привязки, в то время как каждый элемент привязки может добавить еще один кусок в стек каналов.Если вы хотите иметь информацию о привязке в прокси-канале, вы можете добавить ее самостоятельно, используя одно из расширений свойства контекстного канала. Приведенный ниже код показывает один из примеров этого.
public class StackOverflow_6332575 { [ServiceContract] public interface ITest { [OperationContract] int Add(int x, int y); } public class Service : ITest { public int Add(int x, int y) { return x + y; } } static Binding GetBinding() { BasicHttpBinding result = new BasicHttpBinding(); return result; } class MyExtension : IExtension<IContextChannel> { public void Attach(IContextChannel owner) { } public void Detach(IContextChannel owner) { } public Binding Binding { get; set; } } static void CallProxy(ITest proxy) { Console.WriteLine(proxy.Add(3, 5)); MyExtension extension = ((IClientChannel)proxy).Extensions.Find<MyExtension>(); if (extension != null) { Console.WriteLine("Binding: {0}", extension.Binding); } } public static void Test() { string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); host.AddServiceEndpoint(typeof(ITest), GetBinding(), ""); host.Open(); Console.WriteLine("Host opened"); ChannelFactory<ITest> factory = new ChannelFactory<ITest>(GetBinding(), new EndpointAddress(baseAddress)); ITest proxy = factory.CreateChannel(); ((IClientChannel)proxy).Extensions.Add(new MyExtension { Binding = factory.Endpoint.Binding }); CallProxy(proxy); ((IClientChannel)proxy).Close(); factory.Close(); Console.Write("Press ENTER to close the host"); Console.ReadLine(); host.Close(); } }