Gaz*_*yer 6 wcf binding endpoint
我有一个在运行时使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3905 次 |
| 最近记录: |