基於TCP協議繫結的WCF雙工回撥的一般使用方法

weixin_34402090發表於2010-10-28

問題

今天同事想在TCP繫結的wcf服務的外層包一個webservice,一般的服務都可以進行包裝,但遇到有雙工回撥的wcf服務時,稍微麻煩了點,需要在例項化服務時加上回撥例項。

ServiceReference1.AuthenticationServiceClient proxy = new ServiceReference1.AuthenticationServiceClient(instanceContext);

反覆測試了幾種應用形式,發現只有Silverlight在引用這種雙工服務時有無參的過載,其他的都需要一個實現了回撥介面的類,那麼怎麼實現這個類呢?

示例

先定義一個簡單的雙工服務

[ServiceContract(CallbackContract=typeof(IDemoServiceCallBack))]
    public interface IDemoService
    {
        [OperationContract]
        void Add(int a,int b);
    }
    public interface IDemoServiceCallBack
    {
        void GetResult(int c);
    }
    public class DemoService
    {
        [OperationContract(IsOneWay = true)]
        public void Add(int a,int b)
        {
            var client = OperationContext.Current.GetCallbackChannel<IDemoServiceCallBack>();
            client.GetResult(a + b);
        }
    }

說明:此服務提供了一個加的方法,客戶端只需要傳遞兩個整數,服務端計算後會回撥客戶端接收結果。

客戶端呼叫方式

客戶端引用服務後,會發現在例項化時需要自己實現一個回撥介面,

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public class MyCallBack : DemoService.IDemoServiceCallBack
    {
        public void GetResult(int c)
        {            
             //得到結果c,並進行下一步處理。            
        }
     }
呼叫
AddService.IDemoServiceCallback callback = new MyCallBack();
System.ServiceModel.InstanceContext instanceContext = new System.ServiceModel.InstanceContext(callback);
AddService.DemoServiceClient proxy = new AddService.DemoServiceClient(instanceContext);
int c = proxy.Add(1,2);
callback.GetResult(c);

一點想法

至於為什麼只有Silverlight中進行無參的例項化,猜想是由於Silverlight的服務呼叫都是非同步的方式原因,當然這裡正常的呼叫方式
還是需要加上雙工回撥方法實現的。

相關文章