WCF契约回调六步骤简单操作

开发 开发工具
我们今天将会在这篇文章中分为六个步骤为大家详细介绍一下WCF契约回调的创建以及应用技巧等等,希望能给大家带来一些帮助。

WCF开发插件中,对于契约的各种操作是一个比较重要的基础应用技术,我们在学习的过程中需要对其进行充分的掌握。在这里我们就先来一起了解一下关于WCF契约回调的相关方法。方便大家理解。#t#

在WCF的默认的绑定中WSDualHttpBinding是一个安全且可互操作的绑定。适用于双工服务协定或通过 SOAP 媒介进行的通信。本示例就是基于此绑定来实现的。为在编程中多应用些WCF编程的技术,服务端采用代码来创建服务端承载。

 

WCF契约回调第一步 创建标准契约和回调契约

回调契约,用于在客户端显示结果信息

  1. [ServiceContract(Namespace="http://www,cbcye.com/wcf/Callback/)]  
  2. public interface ICalculatorCallback  
  3. {  
  4. [OperationContract]  
  5. void ShowResult(double x, double y, double result);  
  6. }  

标准契约,声明了回调契约的类型

 

  1. [ServiceContract(CallbackContract = typeof(ICalculatorCallback))]  
  2. public interface IDuplexCalculator  
  3. {  
  4. [OperationContract]  
  5. void Add(double x, double y);  
  6. }  

WCF契约回调第二步 在服务端实现标准契约

 

  1. [ServiceBehavior(ConcurrencyModeConcurrencyMode=ConcurrencyMode.Multiple)]  
  2. public class DuplexCalculatorService:IDuplexCalculator  
  3. {   
  4. IDuplexCalculator Members#region IDuplexCalculator Members   
  5. public void Add(double x, double y)  
  6. {  
  7. double result = x + y;  
  8. //调用 GetCallbackChannel< (Of < (T>)>) 属性以获取通道,
    使用该通道可以调用调用服务的客户端实例的操作。  
  9. ICalculatorCallback callBack = OperationContext.Current.
    GetCallbackChannel
    < ICalculatorCallback>();  
  10. callBack.ShowResult(x, y, result);  
  11. }   
  12. #endregion  
  13. }  

 

 

WCF契约回调第三步 创建服务端承载

 

  1. class Program  
  2. {  
  3. static void Main(string[] args)  
  4. {  
  5. HostCalculatorService();  
  6. }   
  7. static void HostCalculatorService()  
  8. {  
  9. Uri dualUri = new Uri("http://localhost:7788/cbcye/Calculator%22);  
  10. //向HOST中添加BaseAddress  
  11. using (ServiceHost calculatorServiceHost = new ServiceHost
    (typeof(DuplexCalculatorService), dualUri))  
  12. {  
  13. //WSDualHttpBinding适用于双工服务协定或通过 SOAP 媒介进行的通信。  
  14. WSDualHttpBinding wsDualHttpBinding = new WSDualHttpBinding();  
  15. //添加服务绑定和服务契约  
  16. calculatorServiceHost.AddServiceEndpoint(typeof(IDuplexCalculator), 
    wsDualHttpBinding, string.Empty);   
  17. //绑定服务行为  
  18. ServiceMetadataBehavior behavior = calculatorServiceHost.
    Description.Behaviors.Find
    < ServiceMetadataBehavior>();  
  19. {  
  20. if (behavior == null)  
  21. {  
  22. behavior = new ServiceMetadataBehavior();  
  23. behavior.HttpGetEnabled = true;  
  24. calculatorServiceHost.Description.Behaviors.Add(behavior);  
  25. }  
  26. else  
  27. {  
  28. behavior.HttpGetEnabled = true;  
  29. }  
  30. }   
  31. //启动事件  
  32. calculatorServiceHost.Opened += delegate  
  33. {  
  34. Console.WriteLine("Calculator Service has begun to listen 
    on "+ dualUri.ToString());  
  35. };   
  36. calculatorServiceHost.Open();  
  37. Console.Read();  
  38. }  
  39. }  

 

WCF契约回调第四步 在客户端实现回调契约

 

  1. class CalculatorCallbackHandler:ICalculatorCallback  
  2. {  
  3. #region ICalculatorCallback Members   
  4. public void ShowResult(double x, double y, double result)  
  5. {  
  6. Console.WriteLine("x + y = {2} (x = {0} , y = {1})", x, y, result);  
  7. }   
  8. #endregion  

 

 

WCF契约回调第五步 实现客户端代理

 

  1. class ClientProxy:ClientBase< IDuplexCalculator>,IDuplexCalculator  
  2. {   
  3. public ClientProxy(InstanceContext callbackInstance)  
  4. : base(callbackInstance)  
  5. { }   
  6. #region IDuplexCalculator Members   
  7. public void Add(double x, double y)  
  8. {  
  9. this.Channel.Add(x, y);  
  10. }  
  11. #endregion  

 

 

WCF契约回调第六步 客户端调用

程序代码

 

  1. class Program  
  2. {  
  3. static void Main(string[] args)  
  4. {  
  5. try  
  6. {  
  7. InvocateDuplexCalculator();  
  8. }  
  9. catch (Exception exp)  
  10. {  
  11. Console.WriteLine("[Error] " + exp.Message);  
  12. }   
  13. Console.Read();  
  14. }   
  15. static void InvocateDuplexCalculator()  
  16. {  
  17. CalculatorCallbackHandler callbackHandler = 
    new CalculatorCallbackHandler();   
  18. using (ClientProxy calculator = new ClientProxy
    (new InstanceContext(callbackHandler)))  
  19. {  
  20. Console.WriteLine("Begin to invocate duplex calculator ");  
  21. calculator.Add(85, 86);  
  22. calculator.Close();  
  23. }  
  24. }  

 

 

配置文件

由于使用WSDualHttpBinding绑定执行回调时,需要开通两个HTTP通道,一个用于服务,一个用于回调。因此需要配置两个HTTP地址。

 

  1. < ?xml version="1.0" encoding="utf-8" ?> 
  2. < configuration> 
  3. < system.serviceModel> 
  4. < client> 
  5. < !--bindingConfiguration - 指定一个binding的配置名称,跟< bindings>
    下面同类< binding>的name匹配--> 
  6. < endpoint name="SubscriptionService" 
  7. address="http://localhost:7788/cbcye/Calculator%22  
  8. binding="wsDualHttpBinding" 
  9. bindingConfiguration="wsDualHttpBinding_DuplexCalculator" 
  10. contract="Cbcye.Contract.IDuplexCalculator" 
  11. /> 
  12. < /client> 
  13. < bindings> 
  14. < !-- 指定一个或多个系统预定义的binding,比如< basicHttpBinding>
    当然也可以指定自定义的customBinding,  
  15. 然后在某个指定的binding下建立一个或多个配置,以便被Endpoint来使用这些配置 --> 
  16. < wsDualHttpBinding> 
  17. < binding 
  18. name="wsDualHttpBinding_DuplexCalculator" 
  19. clientBaseAddress="http://localhost:7799/cbcye/Calculator%22  
  20. /> 
  21. < /wsDualHttpBinding> 
  22. < /bindings> 
  23. < /system.serviceModel> 
  24. < /configuration> 

以上就是WCF契约回调的全部方法介绍。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-22 09:38:22

WCF开发

2010-02-23 15:12:25

WCF客户端

2010-09-25 16:32:13

企业风险管理安全管理

2012-05-04 10:07:56

2021-11-15 23:44:56

网络安全零信任隐私

2010-09-24 15:50:03

2010-03-01 15:12:53

WCF回调契约

2010-02-26 16:16:15

2009-11-06 16:05:37

WCF回调契约

2009-12-21 10:00:46

WCF基础开发

2010-02-02 16:01:30

安装fedora 12

2010-03-02 10:54:42

WCF回调操作

2010-07-09 12:08:36

设置SNMP协议

2009-11-06 16:13:45

WCF回调

2009-09-09 09:46:00

MyEclipse配置

2009-04-10 00:25:53

上网行为管理安全策略企业安全

2015-01-28 16:09:33

广域网优化

2010-11-19 10:18:11

网络连接故障

2013-08-23 09:30:56

BYOD方案BYODMDM

2010-06-29 19:23:20

UML活动图
点赞
收藏

51CTO技术栈公众号