1. 程式人生 > >WCF duplex 簡單例項

WCF duplex 簡單例項

1.定義兩個介面
//客戶端呼叫
 [ServiceContract(CallbackContract = typeof(IContractCallback))]
    public interface IContract
    {
        [OperationContract(IsOneWay = true)]
        void Foo(DataMember dt);
    }




//回撥介面,伺服器呼叫客戶端程式碼,這個介面由客戶端實現
    [ServiceContract]
    public interface IContractCallback
    {
        [OperationContract(IsOneWay = true)]
        void OnFooCallback();
    }




2.伺服器實現介面
 
[DataContract]
    public class DataMember
    {
        [DataMember(IsRequired = true)]
        public int Id;


        [DataMember(IsRequired = true)]
        public string Name;
    }


    public class Service2 : IContract
    {


        [OperationBehavior(TransactionScopeRequired=true)]
        public void Foo(DataMember dt)
        {
            //do something 


            //...


            //call back,呼叫客戶端的實現
            var callback = OperationContext.Current.GetCallbackChannel<IContractCallback>();
            callback.OnFooCallback();
        }
    }


3,客戶端新增服務引用,實現callback介面
class MyCallback : IContractCallback
    {
        public void OnFooCallback()
        {
            Console.WriteLine("call back from server");
        }
    }




4.呼叫
var instance = new MyCallback();
            InstanceContext instanceContext = new InstanceContext(instance);
            ServiceReference2.ContractClient client = new ServiceReference2.ContractClient(instanceContext);
            client.Open();
            client.Foo(new ServiceReference2.DataMember() { Id = 1, Name = "111" });
            Thread.Sleep(2000);//之所以休眠2s再關閉連線是等待伺服器回撥結束
            client.Close();
            
            Console.ReadKey();