2013-04-02 11 views
5

W normalnym żądanie WCF/odpowiadać umowę, można przeczytać nagłówki wiadomości przy użyciu coś jak:Jak odczytywać nagłówki wiadomości WCF w dupleksie?

OperationContract.Current.IncomingMessageHeaders 

Nie mogę dowiedzieć się, jak to zrobić na stronie zwrotnej umowy dwustronne. Wewnątrz realizacji wywołania zwrotnego OperationContext.Current jest null.

Edycja 4/5/2013: Używam niestandardowego powiązania opartego na net.tcp, ale z wieloma dostosowaniami. Na przykład, używając kodowania buforów komunikatów zamiast Xml. Istnieje również niestandardowe zabezpieczenie.

Odpowiedz

3

Jakiego wiązania używasz? W SSCCE poniżej kontekst nie jest pusty w implementacji wywołania zwrotnego.

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

Dzięki za wyjątkowo kompletny przykład. Używam niestandardowego powiązania z kodowaniem buforów protokołów, niestandardowymi zabezpieczeniami i kilkoma innymi rzeczami, których nie pamiętam z mojej głowy (dziś spojrzę). Czy to może wpłynąć na OperationContext? –

Powiązane problemy