WCF契約回調六步驟簡單操作
在WCF開發插件中,對于契約的各種操作是一個比較重要的基礎應用技術,我們在學習的過程中需要對其進行充分的掌握。在這里我們就先來一起了解一下關于WCF契約回調的相關方法。方便大家理解。#t#
在WCF的默認的綁定中WSDualHttpBinding是一個安全且可互操作的綁定。適用于雙工服務協定或通過 SOAP 媒介進行的通信。本示例就是基于此綁定來實現的。為在編程中多應用些WCF編程的技術,服務端采用代碼來創建服務端承載。
WCF契約回調第一步 創建標準契約和回調契約
回調契約,用于在客戶端顯示結果信息
- [ServiceContract(Namespace="http://www,cbcye.com/wcf/Callback/)]
- public interface ICalculatorCallback
- {
- [OperationContract]
- void ShowResult(double x, double y, double result);
- }
標準契約,聲明了回調契約的類型
- [ServiceContract(CallbackContract = typeof(ICalculatorCallback))]
- public interface IDuplexCalculator
- {
- [OperationContract]
- void Add(double x, double y);
- }
WCF契約回調第二步 在服務端實現標準契約
- [ServiceBehavior(ConcurrencyModeConcurrencyMode=ConcurrencyMode.Multiple)]
- public class DuplexCalculatorService:IDuplexCalculator
- {
- IDuplexCalculator Members#region IDuplexCalculator Members
- public void Add(double x, double y)
- {
- double result = x + y;
- //調用 GetCallbackChannel< (Of < (T>)>) 屬性以獲取通道,
使用該通道可以調用調用服務的客戶端實例的操作。- ICalculatorCallback callBack = OperationContext.Current.
GetCallbackChannel< ICalculatorCallback>();- callBack.ShowResult(x, y, result);
- }
- #endregion
- }
WCF契約回調第三步 創建服務端承載
- class Program
- {
- static void Main(string[] args)
- {
- HostCalculatorService();
- }
- static void HostCalculatorService()
- {
- Uri dualUri = new Uri("http://localhost:7788/cbcye/Calculator%22);
- //向HOST中添加BaseAddress
- using (ServiceHost calculatorServiceHost = new ServiceHost
(typeof(DuplexCalculatorService), dualUri))- {
- //WSDualHttpBinding適用于雙工服務協定或通過 SOAP 媒介進行的通信。
- WSDualHttpBinding wsDualHttpBinding = new WSDualHttpBinding();
- //添加服務綁定和服務契約
- calculatorServiceHost.AddServiceEndpoint(typeof(IDuplexCalculator),
wsDualHttpBinding, string.Empty);- //綁定服務行為
- ServiceMetadataBehavior behavior = calculatorServiceHost.
Description.Behaviors.Find< ServiceMetadataBehavior>();- {
- if (behavior == null)
- {
- behavior = new ServiceMetadataBehavior();
- behavior.HttpGetEnabled = true;
- calculatorServiceHost.Description.Behaviors.Add(behavior);
- }
- else
- {
- behavior.HttpGetEnabled = true;
- }
- }
- //啟動事件
- calculatorServiceHost.Opened += delegate
- {
- Console.WriteLine("Calculator Service has begun to listen
on "+ dualUri.ToString());- };
- calculatorServiceHost.Open();
- Console.Read();
- }
- }
- }
WCF契約回調第四步 在客戶端實現回調契約
- class CalculatorCallbackHandler:ICalculatorCallback
- {
- #region ICalculatorCallback Members
- public void ShowResult(double x, double y, double result)
- {
- Console.WriteLine("x + y = {2} (x = {0} , y = {1})", x, y, result);
- }
- #endregion
- }
WCF契約回調第五步 實現客戶端代理
- class ClientProxy:ClientBase< IDuplexCalculator>,IDuplexCalculator
- {
- public ClientProxy(InstanceContext callbackInstance)
- : base(callbackInstance)
- { }
- #region IDuplexCalculator Members
- public void Add(double x, double y)
- {
- this.Channel.Add(x, y);
- }
- #endregion
- }
WCF契約回調第六步 客戶端調用
程序代碼
- class Program
- {
- static void Main(string[] args)
- {
- try
- {
- InvocateDuplexCalculator();
- }
- catch (Exception exp)
- {
- Console.WriteLine("[Error] " + exp.Message);
- }
- Console.Read();
- }
- static void InvocateDuplexCalculator()
- {
- CalculatorCallbackHandler callbackHandler =
new CalculatorCallbackHandler();- using (ClientProxy calculator = new ClientProxy
(new InstanceContext(callbackHandler)))- {
- Console.WriteLine("Begin to invocate duplex calculator ");
- calculator.Add(85, 86);
- calculator.Close();
- }
- }
- }
配置文件
由于使用WSDualHttpBinding綁定執行回調時,需要開通兩個HTTP通道,一個用于服務,一個用于回調。因此需要配置兩個HTTP地址。
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < client>
- < !--bindingConfiguration - 指定一個binding的配置名稱,跟< bindings>
下面同類< binding>的name匹配-->- < endpoint name="SubscriptionService"
- address="http://localhost:7788/cbcye/Calculator%22
- binding="wsDualHttpBinding"
- bindingConfiguration="wsDualHttpBinding_DuplexCalculator"
- contract="Cbcye.Contract.IDuplexCalculator"
- />
- < /client>
- < bindings>
- < !-- 指定一個或多個系統預定義的binding,比如< basicHttpBinding>,
當然也可以指定自定義的customBinding,- 然后在某個指定的binding下建立一個或多個配置,以便被Endpoint來使用這些配置 -->
- < wsDualHttpBinding>
- < binding
- name="wsDualHttpBinding_DuplexCalculator"
- clientBaseAddress="http://localhost:7799/cbcye/Calculator%22
- />
- < /wsDualHttpBinding>
- < /bindings>
- < /system.serviceModel>
- < /configuration>
以上就是WCF契約回調的全部方法介紹。