2013-04-02 49 views
5

Trong một yêu cầu WCF bình thường/trả lời hợp đồng, bạn có thể đọc tiêu đề thư sử dụng một cái gì đó như:Cách đọc tiêu đề thư WCF trong gọi lại hai mặt?

OperationContract.Current.IncomingMessageHeaders 

Những gì tôi không thể hình dung ra là làm thế nào để làm điều này ở phía bên callback của một hợp đồng song. Bên trong triển khai gọi lại OperationContext.Currentnull.

Chỉnh sửa 4/5/2013: Tôi đang sử dụng liên kết tùy chỉnh dựa trên net.tcp, nhưng có nhiều tùy chỉnh. Ví dụ, bằng cách sử dụng giao thức bộ đệm mã hóa tin nhắn chứ không phải là Xml. Ngoài ra còn có một số bảo mật tùy chỉnh.

Trả lời

3

Bạn đang sử dụng tính năng ràng buộc nào? Trong SSCCE dưới ngữ cảnh không phải là null về việc thực hiện gọi lại.

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

Cảm ơn ví dụ cực kỳ hoàn chỉnh. Tôi đang sử dụng một ràng buộc tùy chỉnh với giao thức mã hóa bộ đệm thư, một số bảo mật tùy chỉnh và một vài thứ khác tôi không nhớ ra khỏi đỉnh đầu của tôi (tôi sẽ xem xét ngày hôm nay). Điều đó có ảnh hưởng đến OperationContext không? –