查看: 3604|回复: 0

[.NET源码] WCF实现的计算器功能实例

发表于 2018-2-8 08:00:02

本文实例讲述了WCF实现的计算器功能。分享给大家供大家参考,具体如下:

对于WCF,我们有了前面的理论基础,今天通过一个计算器的实例主要给大家讲解怎么一步一步地创建一个完整的WCF应用。

一、创建整个解决方案

Calculator.Service:一个类库项目,定义服务契约(Service Contract),应用System.ServiceModel程序集;提供对WCF服务的实现。
Calculator.Host:一个Windows窗体应用程序,实现对定义在Calculator.Service项目中的服务的寄宿,该项目需要引用Calculator.Service项目和System.ServiceModel程序集。
Calculator.Client:一个Windows窗体应用程序模拟服务的客户端,该项目应用System.ServiceModel程序集。

二、创建服务契约

一般,我们通过接口的形式定义服务契约。通过下面的代码,将一个接口ICalculator定义成服务契约。我们通过在接口上应用System.ServiceModel.ServiceContractAttribute特性将一个接口定义成服务契约。

将接口定义成服务契约后,接口的方法成员并不能自动成为服务的操作。我们需要在相应的操作方法上面显式地应用OperationContractAttribute特性。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ServiceModel;
  6. namespace Calculator.Service
  7. {
  8. [ServiceContract]
  9. public interface ICalculator
  10. {
  11. [OperationContract]
  12. double Add(double x, double y);
  13. [OperationContract]
  14. double Subtract(double x, double y);
  15. [OperationContract]
  16. double Multiply(double x, double y);
  17. [OperationContract]
  18. double Divide(double x, double y);
  19. }
  20. }
复制代码

三、创建服务

当服务契约创建成功后,我们需要通过实现服务契约来创建具体的WCF服务,WCF服务CalculatorService实现了服务契约的接口ICalculator,实现了所有的服务操作。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Calculator.Service
  6. {
  7. public class CalculatorService:ICalculator
  8. {
  9. public double Add(double x, double y)
  10. {
  11. return x + y;
  12. }
  13. public double Subtract(double x, double y)
  14. {
  15. return x - y;
  16. }
  17. public double Multiply(double x, double y)
  18. {
  19. return x * y;
  20. }
  21. public double Divide(double x, double y)
  22. {
  23. return x / y;
  24. }
  25. }
  26. }
复制代码

四、通过自我寄宿的方式寄宿服务

服务寄宿的目的就是开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或多个中级诶单,使之暴露给潜在的服务消费者。服务消费者最终通过相匹配的终结点对该服务进行调用。我们完全可以通过代码的方式完成所有的服务寄宿工作。

  1. using Calculator.Service;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.ServiceModel;
  9. using System.ServiceModel.Description;
  10. using System.Text;
  11. using System.Windows.Forms;
  12. namespace Calculator.Host
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20. ServiceHost host = null;
  21. private void btnOpen_Click(object sender, EventArgs e)
  22. {
  23. host = new ServiceHost(typeof(CalculatorService));
  24. host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://localhost:8008/Calculator");
  25. if (host.Description.Behaviors.Find<ServiceMetadataBehavior>()==null)
  26. {
  27. ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
  28. behavior.HttpGetEnabled = true;
  29. behavior.HttpGetUrl = new Uri("http://localhost:8008/Calculator/metadata");
  30. host.Description.Behaviors.Add(behavior);
  31. }
  32. host.Opened += delegate { label1.Text = "服务已经启动!"; };
  33. host.Open();
  34. }
  35. private void btnClose_Click(object sender, EventArgs e)
  36. {
  37. if (host.State != CommunicationState.Closed)
  38. {
  39. host.Closed += delegate { label1.Text = "服务已经停止!"; };
  40. host.Close();
  41. }
  42. }
  43. }
  44. }
复制代码

五、创建客户端调用服务

服务被成功寄宿后,服务端便开始了服务调用请求的监听工作。此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据,创建爱你客户端程序进行服务的消费。在VS下,当我们添加服务引用的时候,VS在内部帮我们实现元数据的获取,并借组这些元数据通过代码生成工具自动生成用于服务调用的服务代理相关代码和相应的配置。

我们可以创建CalculatorClient对象,执行相应方法调用服务操作。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. namespace Calculator.Client
  10. {
  11. public partial class Form1 : Form
  12. {
  13. public Form1()
  14. {
  15. InitializeComponent();
  16. }
  17. private void Form1_Load(object sender, EventArgs e)
  18. {
  19. comboBox1.Text = "+";
  20. }
  21. private void button1_Click(object sender, EventArgs e)
  22. {
  23. CalculatorService.CalculatorClient client = new CalculatorService.CalculatorClient();
  24. double x = Convert.ToDouble (textBox1.Text);
  25. double y = Convert.ToDouble(textBox2.Text);
  26. double result=0;
  27. string operater = comboBox1.Text;
  28. switch (operater )
  29. {
  30. case "+":
  31. result = client.Add(x, y);
  32. break;
  33. case "-":
  34. result = client.Subtract(x, y);
  35. break;
  36. case "*":
  37. result = client.Multiply(x, y);
  38. break;
  39. case "/":
  40. if (y==0)
  41. {
  42. MessageBox.Show("除数不能为0!");
  43. return;
  44. }
  45. result = client.Divide(x, y);
  46. break;
  47. }
  48. label1.Text = textBox1.Text + comboBox1.Text + textBox2.Text + " = " + Convert.ToString(result);
  49. }
  50. }
  51. }
复制代码

在这个计算器实例中,我们实现了一个简单的计算服务(CalculatorService),提供基本的加、减、乘、除的运算。客户端和服务通过运行在不同进程模拟,体现了客户端和服务端进程互相调用的关系。

PS:这里再为大家推荐几款在线计算工具供大家参考使用:

在线一元函数(方程)求解计算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《C#窗体操作技巧汇总》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》

希望本文所述对大家C#程序设计有所帮助。

您可能感兴趣的文章:

  • C# 一个WCF简单实例
  • WinForm窗体调用WCF服务窗体卡死问题
  • WCF配置心得
  • C#编写的windows计算器的实例代码
  • c#入门之实现简易存款利息计算器示例
  • C#日历样式的下拉式计算器实例讲解
  • C# WCF简单入门图文教程(VS2010版)
  • C#实现Winform版计算器
  • C#计算器编写代码
  • 总结C#动态调用WCF接口的两种方法


回复

使用道具 举报