問題
今天同事想在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的服務呼叫都是非同步的方式原因,當然這裡正常的呼叫方式
還是需要加上雙工回撥方法實現的。