在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契约回调的全部方法介绍。
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号