如何以编程方式获取客户端代理使用的绑定?

时间:2011-06-13 15:31:29

标签: wcf binding endpoint

我在运行时使用DuplexChannelFactory生成了一个WCF代理。

如何仅在给定DuplexChannelFactory返回的服务接口的情况下访问绑定信息?

我可以通过转换到IClientChannel获得大多数东西,但我似乎无法在那里找到绑定信息。我能得到的最接近的是IClientChannel.RemoteAddress,它是一个端点,但似乎也没有绑定信息。 : - /

1 个答案:

答案 0 :(得分:6)

你不能(直接)。您可以从频道中获取一些内容,例如消息版本(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();
    }
}