NetTcpContextBinding でもコールバックできるか?

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();
        }
    }


}

実行結果がこちら。

f:id:griefworker:20090514203429p:image

ちゃんとコールバック出来てます。
NetTcpContextBinding は NetTcpBinding を継承しているから当然なんですけど。