2013-04-02 22 views
5

/sözleşme cevap, gibi bir şey kullanarak mesaj başlıklarını okuyabilir: Ben çözemiyorum neWCF ileti üstbilgileri dubleks geri çağrıda nasıl okunur? Normal bir WCF istekte

OperationContract.Current.IncomingMessageHeaders 

dubleks sözleşmenin geri arama tarafında bunun nasıl olduğunu. Geri arama uygulamasının içinde OperationContext.Current, null'dur.

Düzeltme 4/5/2013: Net.tcp'ye dayanan, ancak çok sayıda özelleştirmeyle özel bir cilt kullanıyorum. Örneğin, protokol arabelleklerini Xml yerine mesaj kodlaması kullanarak. Ayrıca bazı özel güvenlik var.

cevap

3

Hangi bağlama kullanıyorsunuz? Aşağıdaki SSCCE'de, geri çağrı uygulamasında içerik null değildir.

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

Son derece eksiksiz örnek için teşekkür ederiz. Ben protokol arabellek mesaj kodlama, özel bir güvenlik ve kafamın üstünden hatırlamıyorum birkaç şey (ben bugün bakacağım) birkaç şey ile özel bir bağlayıcı kullanıyorum. Bu OperationContext'i etkileyebilir mi? –