WCF实现的计算器功能实例
作者:傻丫头与科技 发布时间:2022-05-07 23:17:12
本文实例讲述了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.jb51.net/jisuanqi/equ_jisuanqi
科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue
在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq
希望本文所述对大家C#程序设计有所帮助。


猜你喜欢
- 前文由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天, 网上各种版本
- 高并发访问时,缓存、限流、降级往往是系统的利剑,在互联网蓬勃发展的时期,经常会面临因用户暴涨导致的请求不可用的情况,甚至引发连锁反映导致整个
- 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java
- Intersect子句一、简介Intersect返回交集,交集是指同时出现在两个集合中的元素,和数据库中的Intersect方法实现功能一样
- 代理模式代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远
- 本文实例讲述了C#及WPF获取本机所有字体和颜色的方法。分享给大家供大家参考。具体如下:WPF 获取所有的字体:System.Drawing
- 点击按钮,先自动进行下拉刷新,也可以手动刷新,刷新完后,最后就多一行数据。有四个选项卡。前两天导师要求做一个给本科学生预定机房座位的app,
- Java也提供图像化编程图形化GUI(图形用户界面)GUI1 Graphical User Interface(图形用户接口)2
- 上一篇文章我们了解了Java背包问题求解实例代码,接下来我们看看Java中模仿用户登录的相关代码,下面是具体内容。基于用户从控制台输入模拟的
- 开发过程中,如果使用mybatis做为ORM框架,经常需要打印出完整的sql语句以及执行的结果做为参考。虽然mybatis结合日志框架可以做
- 下边是一些我们常用的正则表达式。自己写的一些正则表达式,可以先在线测评一下。一、校验数字的表达式 1 数字:^[0-9]*$&nb
- 我的环境* JDK 1.8 * maven 3.6.0 * node环境1.为什么需要前后端项目开发时分离,部署时合并?
- 前言在mybatis和mybatis plus里,如果你的实体字段是一个枚举类型,而在数据表里是整型,这时在存储时需要进行处理,默认情况下,
- 了解内存的原理1、内存是由 Key 和 Value 组成,Key 是内存地址、Value 是存储的数据;2、Key:是一个32位长度的二进制
- fastjson转换对象实体@JsonProperty不生效项目场景请求第三方应用 返回json数据问题描述第三方返回的数据中,存在java
- Result可以设定全局结果集,如:<struts> <constant name="struts
- 最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自
- 就是仿照现在扫一扫的形式,周围是半透明的遮挡,然后中间是全透明的,拍摄后只截取框内的内容查了很多博客,实现起来真的太复杂了,本人比较怕麻烦所
- 系统: lc android4.4 在做前后摄像头录像的时候,发现会出现花屏的时候,但不是必现,可能会在某一次重启之后会出现,而且出现之后会
- 本文主要给大家介绍java的InputStream 流的使用。(1)FileInputstream: 子类,读取数据的通道使用步骤:1.获取