WCF实现的计算器功能实例

发布时间 - 2026-01-11 01:52:55    点击率:

本文实例讲述了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特性。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace Calculator.Service
{
  [ServiceContract]
  public interface ICalculator
  {
    [OperationContract]
    double Add(double x, double y);
    [OperationContract]
    double Subtract(double x, double y);
    [OperationContract]
    double Multiply(double x, double y);
    [OperationContract]
    double Divide(double x, double y);
  }
}

三、创建服务

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Calculator.Service
{
  public class CalculatorService:ICalculator
  {
    public double Add(double x, double y)
    {
      return x + y;
    }
    public double Subtract(double x, double y)
    {
      return x - y;
    }
    public double Multiply(double x, double y)
    {
      return x * y;
    }
    public double Divide(double x, double y)
    {
      return x / y;
    }
  }
}

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

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

using Calculator.Service;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using System.Windows.Forms;
namespace Calculator.Host
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    ServiceHost host = null;
    private void btnOpen_Click(object sender, EventArgs e)
    {
      host = new ServiceHost(typeof(CalculatorService));
      host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://localhost:8008/Calculator");
      if (host.Description.Behaviors.Find<ServiceMetadataBehavior>()==null)
      {
        ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
        behavior.HttpGetEnabled = true;
        behavior.HttpGetUrl = new Uri("http://localhost:8008/Calculator/metadata");
        host.Description.Behaviors.Add(behavior);
      }
      host.Opened += delegate { label1.Text = "服务已经启动!"; };
      host.Open();
    }
    private void btnClose_Click(object sender, EventArgs e)
    {
      if (host.State != CommunicationState.Closed)
      {
        host.Closed += delegate { label1.Text = "服务已经停止!"; };
        host.Close();
      }
    }
  }
}

五、创建客户端调用服务

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

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Calculator.Client
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
      comboBox1.Text = "+";
    }
    private void button1_Click(object sender, EventArgs e)
    {
      CalculatorService.CalculatorClient client = new CalculatorService.CalculatorClient();
      double x = Convert.ToDouble (textBox1.Text);
      double y = Convert.ToDouble(textBox2.Text);
      double result=0;
      string operater = comboBox1.Text;
      switch (operater )
      {
        case "+":
          result = client.Add(x, y);
          break;
        case "-":
          result = client.Subtract(x, y);
          break;
        case "*":
          result = client.Multiply(x, y);
          break;
        case "/":
          if (y==0)
          {
            MessageBox.Show("除数不能为0!");
            return;
          }
          result = client.Divide(x, y);
          break;
      }
      label1.Text = textBox1.Text + comboBox1.Text + textBox2.Text + " = " + Convert.ToString(result);
    }
  }
}

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

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

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

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

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

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

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


# WCF  # 计算器  # C#计算器编写代码  # C#实现Winform版计算器  # C#日历样式的下拉式计算器实例讲解  # c#入门之实现简易存款利息计算器示例  # C#编写的windows计算器的实例代码  # C# 一个WCF简单实例  # WCF配置心得  # WinForm窗体调用WCF服务窗体卡死问题  # C# WCF简单入门图文教程(VS2010版)  # 总结C#动态调用WCF接口的两种方法  # 客户端  # 程序设计  # 实现了  # 给大家  # 该项目  # 服务端  # 应用程序  # 相关内容  # 在这个  # 多个  # 感兴趣  # 我们可以  # 数据结构  # 可以通过  # 当我们  # 并不能  # 使之  # 能为  # 提供一个  # 更多关于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel如何使用Gate和Policy进行授权?(权限控制)  如何快速建站并高效导出源代码?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何在IIS7上新建站点并设置安全权限?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  音乐网站服务器如何优化API响应速度?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  JavaScript如何操作视频_媒体API怎么控制播放  Laravel观察者模式如何使用_Laravel Model Observer配置  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  网站图片在线制作软件,怎么在图片上做链接?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何在万网主机上快速搭建网站?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何用AI帮你把自己的生活经历写成一个有趣的故事?  java中使用zxing批量生成二维码立牌  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel如何发送系统通知?(Notification渠道示例)  Laravel如何记录自定义日志?(Log频道配置)  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  原生JS获取元素集合的子元素宽度实例  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何处理文件下载请求?(Response示例)  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何快速配置高效服务器建站软件?  浅谈javascript alert和confirm的美化  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  php json中文编码为null的解决办法  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel怎么使用Intervention Image库处理图片上传和缩放  装修招标网站设计制作流程,装修招标流程?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Laravel storage目录权限问题_Laravel文件写入权限设置  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】