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

#wcf #binding #endpoint

#wcf #привязка #конечная точка

Вопрос:

У меня есть прокси 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 resu<
    }
    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();
    }
}