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),提供基本的加、减、乘、除的运算。客户端和服务通过运行在不同进程模拟,体现了客户端和服务端进程互相调用的关系。

时间: 2024-03-21 23:39:43

WCF 之 计算器实例的相关文章

Javascript 实现简单计算器实例代码

Javascript 实现简单计算器实例代码 这篇文章主要介绍了Javascript 实现简单计算器实例代码的相关资料,需要的朋友可以参考下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

Python全栈--6.1-match-search-findall-group(s)的区别以及计算器实例

Python全栈--6.1-match-search-findall-group(s)的区别以及计算器实例match.search.findall.group(s) 区别12345    import re# match findall经常用# re.match() #从开头匹配,没有匹配到对象就返回NONE# re.search() #浏览全部字符,匹配第一个符合规则的字符串# re.findall() # 将匹配到的所有内容都放置在一个列表中一.match有两种情况 -------  有分组

QT开发(三十)——计算器实例开发

QT开发(三十)--计算器实例开发 一.计算器界面制作 计算器界面需要QWidget组件作为顶层窗口,QLineEdit组件作为输入框,QPsuhButton作为按钮. 界面规划设计如下: #include <QApplication> #include <QWidget> #include <QLineEdit> #include <QPushButton>   int main(int argc, char *argv[]) {     QApplica

WCF并发控制与实例模式

WCF实例模式类型与区别 实例化模式 instanceMode percall        单调模式 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] persession  会话模式 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] singleTon   单例模式 [ServiceBehavior(InstanceCo

WCF 通道模型——实例篇

昨天在园子里看了一位高手的文章,对于WCF通道模型从设计层面到实际运用层面讲的非常的清楚和透彻,所以今天自己也动手写一点code来理解一下. 之前关于wcf通道模型的讲解的书看了两遍也没这次理解那么的深刻. 今天演示的只是一个简单的Demo, 这个程序的code其实在MSDN上就可以找到,稍加些自己的设计在里面就可以了,但WCF底层通信的逻辑和用法与MSDN上面的演示程序是一样.接下来先介绍一下整体需求. 需求:实现一个客户端和服务端,采用Http协议和请求响应式通信方式,实现简单的文本信息发送

jQuery_计算器实例

知识点: fadeIn()---计算器界面载入淡入效果 hover()---鼠标移入移出某个元素时触发的事件 click()---鼠标单击事件 css()---对元素样式的操作 val()---获取表单元素的值 text()---对元素div内容的处理 substring(start,end)---从start到end截取字符串的子串 indexOf()--字符串索引函数(在字符串中查找指定字符串,返回值是目标字符串在字符串的开始位置,返回-1表示没找到) .length --- 获取字符串的长

Java实例---计算器实例

1.计算器上的键的显示名字 1.0 继承JFrame类 public class Calculate extends JFrame { } 1.1定义常量 /** 计算器上的键的显示名字 */ public final String[] KEYS = { "7", "8", "9", "/", "sqrt", "4", "5", "6", &quo

vue实现网页简单计算器实例代码

效果: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="js/vue.js" ></script> </head> <body> <div id=&q

WCF服务类的实例模式(本文为转载)

WCF开发时如何选择正确的实例模式(InstanceMode)? 在使用WCF实例模型时,你是否思考过这几个的问题: ”WCF中的实例模式如何正确应用”? ”使用WCF中的实例模式有何原则可以遵循吗”? 众所周知:客户端调用服务时,最终会将调用服务端的某个实例来完成.在WCF服务中,可以通过ServiceBehavior的InstanceContextMode设置服务实例. InstanceContextMode定义如下: // 摘要:     //     指定可用来处理包含在传入消息中的调用