2011-06-13 10 views
6

Tengo un proxy WCF generado en tiempo de ejecución con DuplexChannelFactory.¿Cómo puedo obtener mediante programación el enlace que usa mi proxy de cliente?

¿Cómo puedo acceder a la información de enlace dado únicamente la interfaz de servicio devuelta por DuplexChannelFactory?

Puedo obtener la mayoría de las cosas mediante conversión a un IClientChannel, pero parece que no puedo encontrar información vinculante allí. Lo más cercano que puedo obtener es IClientChannel.RemoteAddress, que es un punto final, pero que tampoco parece tener información vinculante. : -/

Respuesta

6

Usted no puede (directamente). Hay algunas cosas que puede obtener del canal, como la versión del mensaje (channel.GetProperty<MessageVersion>()) y otros valores. Pero el enlace no es uno de esos. El canal se crea después de que el enlace se "deconstruye" (es decir, se expande en sus elementos de enlace, mientras que cada elemento de enlace puede agregar una pieza más a la pila de canales.

Si desea tener la información de enlace en el canal proxy Sin embargo, puede agregarlo usted mismo, utilizando una de las propiedades de extensión del canal de contexto. El siguiente código muestra un ejemplo de eso.

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

Muchas gracias por su ayuda. – GazTheDestroyer

Cuestiones relacionadas