2011-06-13 18 views
6

DuplexChannelFactory ile çalışma zamanında oluşturulan bir WCF proxy'si var.İstemcimin proxy'sinin kullandığı bağlayıcıyı nasıl programlayabilirim?

Yalnızca DuplexChannelFactory'den döndürülen hizmet arabirimi verilen bağlanma bilgilerine nasıl erişebilirim?

Çoğu şeyi bir IClientChannel'e dönüştürerek alabilirim, ancak orada ciltleme bilgileri göremiyorum. Alabildiğim en yakın nokta, bir uç nokta olan IClientChannel.RemoteAddress'tir, ancak bu da bağlayıcı bilgiler içermiyor. : -// {

cevap

6

Yapamazsınız (doğrudan). Mesaj sürümü (channel.GetProperty<MessageVersion>()) ve diğer değerler gibi kanaldan alabileceğiniz birkaç şey vardır. Ama bağlayıcı, bunlardan biri değil. Kanal, bağlanma "yapısökümden" sonra (yani, bağlanma elemanlarına genişletilirken oluşturulur), her bir bağlayıcı eleman, kanal yığına bir parça daha ekleyebilirken,

Proxy kanalında ciltleme bilgilerine sahip olmak istiyorsanız Ancak, içerik kanalının uzantı özelliklerinden birini kullanarak kendiniz ekleyebilirsiniz. Aşağıdaki kod, bunun bir örneğini gösterir:

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(); 
    } 
} 
+0

Yardımlarınız için çok teşekkürler. – GazTheDestroyer

İlgili konular