WCF异步调用正确实现方法讲解
创始人
2024-06-23 15:40:52
0

WCF编程工具是.NET Framework 3.5的重要组成部分,它独特的统一性,安全性以及兼容性可以帮助开发人员创造一个功能强大的企业级应用解决方案。其中,WCF异步调用是基于消息交换(Message Exchange)来实现的,和我们通常使用委托来实现异步调用有所不同。

WCF异步调用步骤1. 创建服务契约。

  1. [ServiceContract(SessionModeSessionMode=SessionMode.Required)]  
  2. public interface ICalculate  
  3. {  
  4. [OperationContract]  
  5. int Add(int a, int b);  

WCF异步调用步骤2. 为契约方法添加异步版本。

我们为 Add 方法添加了 BeginAdd 和 EndAdd 两个在 .NET SDK 中 "常见" 的异步操作方法。注意 BeginAdd 方法中我们添加了异步声明,而 EndAdd 方法没有。还有就是要注意异步版本方法的参数。

  1. [ServiceContract(SessionModeSessionMode=SessionMode.Required)]  
  2. public interface ICalculate  
  3. {  
  4. [OperationContract]  
  5. int Add(int a, int b);  
  6. [OperationContract(AsyncPattern=true)]  
  7. IAsyncResult BeginAdd(int a, int b, AsyncCallback callBack, 
    object state);  
  8. int EndAdd(IAsyncResult ar);  

WCF异步调用步骤3. 实现服务契约。

你可能注意到了,我们并没有创建 Add 的委托原型,也没有 "真正" 实现 BeginAdd 和 EndAdd。这是因为消息交换会 "异步" 调用 Add 方法,所有的异步版本方法只是用来创建消息声明而已。

  1. public class CalculateService : ICalculate  
  2. {  
  3. public int Add(int a, int b)  
  4. {  
  5. Thread.Sleep(5000);  
  6. Console.WriteLine(OperationContext.Current.SessionId);  
  7. return a + b;  
  8. }  
  9. public IAsyncResult BeginAdd(int a, int b, AsyncCallback 
    callBack, object state)  
  10. {  
  11. throw new Exception("The method or operation is not implemented.");  
  12. }  
  13. public int EndAdd(IAsyncResult ar)  
  14. {  
  15. throw new Exception("The method or operation is not implemented.");  
  16. }  

WCF异步调用步骤4. 我们给一个完整版本,看看执行结果。

  1. [ServiceContract]  
  2. public interface ICalculate  
  3. {  
  4. [OperationContract]  
  5. int Add(int a, int b);  
  6. [OperationContract(AsyncPattern = true)]  
  7. IAsyncResult BeginAdd(int a, int b, AsyncCallback callBack, 
    object state);  
  8. int EndAdd(IAsyncResult ar);  
  9. }  
  10. public class CalculateService : ICalculate  
  11. {  
  12. public int Add(int a, int b)  
  13. {  
  14. Console.WriteLine("服务器方法 Add 开始执行: {0}", DateTime.Now);  
  15. try  
  16. {  
  17. Thread.Sleep(5000);  
  18. return a + b;  
  19. }  
  20. finally  
  21. {  
  22. Console.WriteLine("服务器方法 Add 执行完成: {0}", DateTime.Now);  
  23. }  
  24. }  
  25. public IAsyncResult BeginAdd(int a, int b, AsyncCallback 
    callBack, object state)  
  26. {  
  27. throw new Exception("The method or operation is not implemented.");  
  28. }  
  29. public int EndAdd(IAsyncResult ar)  
  30. {  
  31. throw new Exception("The method or operation is not implemented.");  
  32. }  
  33. }  
  34. public class WcfTest  
  35. {  
  36. public static void Test()  
  37. {  
  38. AppDomain.CreateDomain("Server").DoCallBack(delegate  
  39. {  
  40. ServiceHost host = new ServiceHost(typeof(CalculateService));  
  41. host.AddServiceEndpoint(typeof(ICalculate), new WSHttpBinding(),  
  42. "http://localhost:8080/calc");  
  43. host.Open();  
  44. });  
  45. ICalculate channel = ChannelFactory.CreateChannel
    (new WSHttpBinding(),  
  46. new EndpointAddress("http://localhost:8080/calc"));  
  47. using (channel as IDisposable)  
  48. {  
  49. Console.WriteLine("客户端调用 BeginAdd: {0}", DateTime.Now);  
  50. IAsyncResult ar = channel.BeginAdd(1, 2, delegate 
    { Console.WriteLine("CallBack..."); }, null);  
  51. Console.WriteLine("客户端调用 BeginAdd 完成: {0}", DateTime.Now);  
  52. Console.WriteLine(channel.EndAdd(ar));  
  53. Console.WriteLine("客户端调用 EndAdd 完成: {0}", DateTime.Now);  
  54. }  
  55. }  

输出:

  1. 客户端调用 BeginAdd: 2007-4-1 20:56:47  
  2. 客户端调用 BeginAdd 完成: 2007-4-1 20:56:47  
  3. 服务器方法 Add 开始执行: 2007-4-1 20:56:49  
  4. 服务器方法 Add 执行完成: 2007-4-1 20:56:54  
  5. 3  
  6. 客户端调用 EndAdd 完成: 2007-4-1 20:56:55  
  7. CallBack... 

最后在WCF异步调用步骤中需要注意的是,我们必须使用支持 Session 的 Binding 对象 (BasicHttpBinding 会抛出异常)。

【编辑推荐】

  1. WCF集合类型各种限制于规则介绍
  2. WCF集合反序列化具体操作技巧分享
  3. WCF集合数据契约相关定制方法详解
  4. WCF宿主环境基本概念详解
  5. WCF序列化引擎具体应用技巧分享

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...