NetTcpContextBinding でコールバックができるか試してみました。
まずはコード。
using System; using System.ServiceModel; using System.ServiceModel.Channels; namespace NetTcpContextBindingCallbackSample { // サービスコントラクト [ServiceContract(CallbackContract=typeof(IHelloCallback))] public interface IHelloService { [OperationContract(IsOneWay=true)] void Hello(string name); } // コールバック用コントラクト public interface IHelloCallback { [OperationContract(IsOneWay=true)] void Reply(string message); } // サービスを実装 public class HelloService : IHelloService { public void Hello(string name) { var callback = OperationContext.Current.GetCallbackChannel<IHelloCallback>(); callback.Reply(string.Format("Hello, {0}!", name)); } } // コールバックを受信するクラスを実装 public class HelloCallback : IHelloCallback { public void Reply(string message) { Console.WriteLine(message); } } class Program { static void Main(string[] args) { // エンドポイントのアドレス string address = "net.tcp://localhost:8000/HelloService"; // サービスを開始 ServiceHost host = new ServiceHost(typeof(HelloService)); host.AddServiceEndpoint(typeof(IHelloService), new NetTcpContextBinding(), address); host.Open(); // クライアントを生成 HelloCallback handler = new HelloCallback(); InstanceContext context = new InstanceContext(handler); var channel = DuplexChannelFactory<IHelloService>.CreateChannel( context, new NetTcpContextBinding(), new EndpointAddress(address)); // サービス呼び出し channel.Hello("Bob"); Console.ReadLine(); // チャネルとサービスを終了する ((IChannel)channel).Close(); host.Close(); } } }
実行結果がこちら。
ちゃんとコールバック出来てます。
NetTcpContextBinding は NetTcpBinding を継承しているから当然なんですけど。