2013-04-02 8 views
5

एक सामान्य WCF अनुरोध में/उत्तर अनुबंध, आप की तरह कुछ का उपयोग कर संदेश हेडर पढ़ सकते हैं:डुप्लेक्स कॉलबैक में डब्ल्यूसीएफ संदेश शीर्षलेख कैसे पढ़ा जाए?

OperationContract.Current.IncomingMessageHeaders 

क्या मैं समझ नहीं कैसे एक डुप्लेक्स अनुबंध की कॉलबैक पक्ष पर यह करने के लिए है। कॉलबैक कार्यान्वयन के अंदर OperationContext.Currentnull है।

संपादित करें 4/5/2013: मैं net.tcp पर आधारित कस्टम बाइंडिंग का उपयोग कर रहा हूं, लेकिन कई अनुकूलन के साथ। उदाहरण के लिए, एक्सएमएल की बजाय प्रोटोकॉल बफर संदेश एन्कोडिंग का उपयोग करना। इसके अलावा कुछ कस्टम सुरक्षा भी है।

उत्तर

3

आप किस बाध्यकारी का उपयोग कर रहे हैं? संदर्भ के नीचे एसएससीसीई में कॉलबैक कार्यान्वयन पर शून्य नहीं है।

public class StackOverflow_15769719 
{ 
    [ServiceContract(CallbackContract = typeof(ICallback))] 
    public interface ITest 
    { 
     [OperationContract] 
     string Hello(string text); 
    } 
    [ServiceContract] 
    public interface ICallback 
    { 
     [OperationContract(IsOneWay = true)] 
     void OnHello(string text); 
    } 
    public class Service : ITest 
    { 
     public string Hello(string text) 
     { 
      ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>(); 
      ThreadPool.QueueUserWorkItem(delegate 
      { 
       callback.OnHello(text); 
      }); 

      return text; 
     } 
    } 
    class MyCallback : ICallback 
    { 
     AutoResetEvent evt; 
     public MyCallback(AutoResetEvent evt) 
     { 
      this.evt = evt; 
     } 

     public void OnHello(string text) 
     { 
      Console.WriteLine("[callback] Headers: "); 
      foreach (var header in OperationContext.Current.IncomingMessageHeaders) 
      { 
       Console.WriteLine("[callback] {0}", header); 
      } 

      Console.WriteLine("[callback] OnHello({0})", text); 
      evt.Set(); 
     } 
    } 
    public static void Test() 
    { 
     bool useTcp = false; 
     string baseAddress = useTcp ? 
      "net.tcp://" + Environment.MachineName + ":8000/Service" : 
      "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     Binding binding = useTcp ? 
      (Binding)new NetTcpBinding(SecurityMode.None) : 
      new WSDualHttpBinding(WSDualHttpSecurityMode.None) 
      { 
       ClientBaseAddress = new Uri("http://" + Environment.MachineName + ":8888/Client") 
      }; 
     host.AddServiceEndpoint(typeof(ITest), binding, ""); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     AutoResetEvent evt = new AutoResetEvent(false); 
     MyCallback callback = new MyCallback(evt); 
     DuplexChannelFactory<ITest> factory = new DuplexChannelFactory<ITest>(
      new InstanceContext(callback), 
      binding, 
      new EndpointAddress(baseAddress)); 
     ITest proxy = factory.CreateChannel(); 

     Console.WriteLine(proxy.Hello("foo bar")); 
     evt.WaitOne(); 

     ((IClientChannel)proxy).Close(); 
     factory.Close(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

अत्यंत पूर्ण उदाहरण के लिए धन्यवाद। मैं प्रोटोकॉल बफर संदेश एन्कोडिंग, कुछ कस्टम सुरक्षा और कुछ अन्य चीजों के साथ एक कस्टम बाइंडिंग का उपयोग कर रहा हूं, मुझे अपने सिर के शीर्ष से याद नहीं है (मैं आज देखूंगा)। क्या यह ऑपरेशन कॉन्टेक्स्ट को प्रभावित कर सकता है? –

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