WCF契約回調(diào)六步驟簡(jiǎn)單操作
在WCF開(kāi)發(fā)插件中,對(duì)于契約的各種操作是一個(gè)比較重要的基礎(chǔ)應(yīng)用技術(shù),我們?cè)趯W(xué)習(xí)的過(guò)程中需要對(duì)其進(jìn)行充分的掌握。在這里我們就先來(lái)一起了解一下關(guān)于WCF契約回調(diào)的相關(guān)方法。方便大家理解。#t#
在WCF的默認(rèn)的綁定中WSDualHttpBinding是一個(gè)安全且可互操作的綁定。適用于雙工服務(wù)協(xié)定或通過(guò) SOAP 媒介進(jìn)行的通信。本示例就是基于此綁定來(lái)實(shí)現(xiàn)的。為在編程中多應(yīng)用些WCF編程的技術(shù),服務(wù)端采用代碼來(lái)創(chuàng)建服務(wù)端承載。
WCF契約回調(diào)第一步 創(chuàng)建標(biāo)準(zhǔn)契約和回調(diào)契約
回調(diào)契約,用于在客戶(hù)端顯示結(jié)果信息
- [ServiceContract(Namespace="http://www,cbcye.com/wcf/Callback/)]
- public interface ICalculatorCallback
- {
- [OperationContract]
- void ShowResult(double x, double y, double result);
- }
標(biāo)準(zhǔn)契約,聲明了回調(diào)契約的類(lèi)型
- [ServiceContract(CallbackContract = typeof(ICalculatorCallback))]
- public interface IDuplexCalculator
- {
- [OperationContract]
- void Add(double x, double y);
- }
WCF契約回調(diào)第二步 在服務(wù)端實(shí)現(xiàn)標(biāo)準(zhǔn)契約
- [ServiceBehavior(ConcurrencyModeConcurrencyMode=ConcurrencyMode.Multiple)]
- public class DuplexCalculatorService:IDuplexCalculator
- {
- IDuplexCalculator Members#region IDuplexCalculator Members
- public void Add(double x, double y)
- {
- double result = x + y;
- //調(diào)用 GetCallbackChannel< (Of < (T>)>) 屬性以獲取通道,
使用該通道可以調(diào)用調(diào)用服務(wù)的客戶(hù)端實(shí)例的操作。- ICalculatorCallback callBack = OperationContext.Current.
GetCallbackChannel< ICalculatorCallback>();- callBack.ShowResult(x, y, result);
- }
- #endregion
- }
WCF契約回調(diào)第三步 創(chuàng)建服務(wù)端承載
- 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適用于雙工服務(wù)協(xié)定或通過(guò) SOAP 媒介進(jìn)行的通信。
- WSDualHttpBinding wsDualHttpBinding = new WSDualHttpBinding();
- //添加服務(wù)綁定和服務(wù)契約
- calculatorServiceHost.AddServiceEndpoint(typeof(IDuplexCalculator),
wsDualHttpBinding, string.Empty);- //綁定服務(wù)行為
- 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;
- }
- }
- //啟動(dòng)事件
- calculatorServiceHost.Opened += delegate
- {
- Console.WriteLine("Calculator Service has begun to listen
on "+ dualUri.ToString());- };
- calculatorServiceHost.Open();
- Console.Read();
- }
- }
- }
WCF契約回調(diào)第四步 在客戶(hù)端實(shí)現(xiàn)回調(diào)契約
- 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契約回調(diào)第五步 實(shí)現(xiàn)客戶(hù)端代理
- 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契約回調(diào)第六步 客戶(hù)端調(diào)用
程序代碼
- 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綁定執(zhí)行回調(diào)時(shí),需要開(kāi)通兩個(gè)HTTP通道,一個(gè)用于服務(wù),一個(gè)用于回調(diào)。因此需要配置兩個(gè)HTTP地址。
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < client>
- < !--bindingConfiguration - 指定一個(gè)binding的配置名稱(chēng),跟< bindings>
下面同類(lèi)< binding>的name匹配-->- < endpoint name="SubscriptionService"
- address="http://localhost:7788/cbcye/Calculator%22
- binding="wsDualHttpBinding"
- bindingConfiguration="wsDualHttpBinding_DuplexCalculator"
- contract="Cbcye.Contract.IDuplexCalculator"
- />
- < /client>
- < bindings>
- < !-- 指定一個(gè)或多個(gè)系統(tǒng)預(yù)定義的binding,比如< basicHttpBinding>,
當(dāng)然也可以指定自定義的customBinding,- 然后在某個(gè)指定的binding下建立一個(gè)或多個(gè)配置,以便被Endpoint來(lái)使用這些配置 -->
- < wsDualHttpBinding>
- < binding
- name="wsDualHttpBinding_DuplexCalculator"
- clientBaseAddress="http://localhost:7799/cbcye/Calculator%22
- />
- < /wsDualHttpBinding>
- < /bindings>
- < /system.serviceModel>
- < /configuration>
以上就是WCF契約回調(diào)的全部方法介紹。