2011-06-13 9 views
6

मेरे पास डुप्लेक्सChannelFactory के साथ रनटाइम पर उत्पन्न एक डब्ल्यूसीएफ प्रॉक्सी है।मैं प्रोग्रामिंग के बाध्यकारी कैसे प्राप्त कर सकता हूं कि मेरा क्लाइंट प्रॉक्सी उपयोग कर रहा है?

मैं केवल बाध्यकारी जानकारी तक कैसे पहुंच सकता हूं केवल डुप्लेक्सChannelFactory से सेवा इंटरफेस लौटाया?

मैं आईसीलिएंट चैनल में कास्टिंग करके अधिकतर सामान प्राप्त कर सकता हूं, लेकिन मुझे वहां बाध्यकारी जानकारी नहीं मिल रही है। मैं सबसे नज़दीक प्राप्त कर सकता हूं IlientChannel.RemoteAddress जो एक एंडपॉइंट है, लेकिन ऐसा लगता है कि बाध्यकारी जानकारी भी नहीं है। : -/

उत्तर

6

आप (सीधे) नहीं कर सकते हैं। चैनल से प्राप्त कुछ चीजें हैं, जैसे कि संदेश संस्करण (channel.GetProperty<MessageVersion>()), और अन्य मान। लेकिन बाध्यकारी उनमें से एक नहीं है। चैनल बाध्यकारी "deconstructed" (यानी, अपने बाध्यकारी तत्वों में विस्तारित होने के बाद बनाया गया है, जबकि प्रत्येक बाध्यकारी तत्व चैनल स्टैक में एक और टुकड़ा जोड़ सकता है।

यदि आप प्रॉक्सी चैनल में बाध्यकारी जानकारी चाहते हैं हालांकि, आप संदर्भ चैनल के विस्तार गुणों में से किसी एक का उपयोग करके इसे स्वयं जोड़ सकते हैं। नीचे दिया गया कोड उस का एक उदाहरण दिखाता है।

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

आपकी सहायता के लिए बहुत धन्यवाद। – GazTheDestroyer

संबंधित मुद्दे

 संबंधित मुद्दे