如何解决如何以编程方式获取客户端代理正在使用的绑定?
| 我在运行时使用DuplexChannelFactory生成了WCF代理。 仅从DuplexChannelFactory返回的服务接口,如何访问绑定信息? 我可以通过投射到IClientChannel来获得大多数东西,但是我似乎找不到那里的绑定信息。我能得到的最接近的是IClientChannel.RemoteAddress,它是一个端点,但是似乎也没有绑定信息。 :-/解决方法
您不能(直接)。您可以从通道中获取一些信息,例如消息版本(
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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。