2013-04-02 13 views
5

In un normale richiesta di WCF/risposta del contratto, è possibile leggere le intestazioni dei messaggi utilizzando qualcosa di simile:Come leggere le intestazioni dei messaggi WCF nella richiamata duplex?

OperationContract.Current.IncomingMessageHeaders 

Quello che non riesco a capire è come fare questo sul lato callback di un contratto duplex. All'interno dell'implementazione del callback OperationContext.Current è null.

Modifica 4/5/2013: Sto utilizzando un'associazione personalizzata basata su net.tcp, ma con molte personalizzazioni. Ad esempio, utilizzando la codifica dei messaggi dei buffer dei protocolli anziché Xml. Inoltre c'è qualche sicurezza personalizzata.

risposta

3

Che associazione stai utilizzando? In SSCCE sotto il contesto non è nulla sull'implementazione del callback.

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

Grazie per l'esempio estremamente completo. Sto usando un'associazione personalizzata con la codifica dei messaggi dei buffer del protocollo, una certa sicurezza personalizzata e un paio di altre cose che non ricordo in cima alla mia testa (cercherò oggi). Potrebbe influire su OperationContext? –

Problemi correlati