Как я могу программно получить привязку, которую использует мой клиентский прокси?

У меня есть прокси-сервер WCF, сгенерированный во время выполнения с помощью DuplexChannelFactory.

Как я могу получить доступ к информации о привязке, учитывая только интерфейс службы, возвращенный из DuplexChannelFactory?

Я могу получить большинство вещей путем приведения к IClientChannel, но я не могу найти там информацию о привязке. Самое близкое, что я могу получить, - это IClientChannel.RemoteAddress, который является конечной точкой, но, похоже, у него также нет информации о привязке. :-/


person GazTheDestroyer    schedule 13.06.2011    source источник


Ответы (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();
    }
}
person carlosfigueira    schedule 13.06.2011