WCF初接触实作

我们通过实现一个简单的示例来对WCF有个直观而浅显的认识,希望对初次涉及WCF的朋友有所帮助。

可以简单地认为WCF程序分为4部分:契约、服务、宿主、客户端。我们通过一个例子来逐步完成各部分,示例程序中,客户端可以获取一个信息列表,列表中每一项包括ID、值、读值时刻、状态、状态变动时刻。这里我用的是VS2010。

首先,创建一个空白解决方案WCFDemo。

我们将在其中添加n个项目,分别实现契约、服务、宿主、客户端。如果用VS2010新建“WCF服务库”或者“WCF服务应用程序”,它会默认把契约和服务放在一个项目中,我们这个示例把契约和服务分别放在2个类库项目中。

第一步:契约

  1、添加一个类库WCFDemo.Contracts。

  2、在类库中添加2个文件DataContracts.cs和ServiceContracts.cs,分别放置数据契约和服务契约。

  3、添加引用System.Runtime.Serialization和System.ServiceModel。

  4、编写代码如下:

DataContracts.cs

using System;

using System.Runtime.Serialization;

namespace WCFDemo.Contracts{    [DataContract]    public class DemoData    {        [DataMember]        public int ID { get; set; }

        [DataMember]        public double Value { get; set; }

        [DataMember]        public DateTime ValueTime { get; set; }

        [DataMember]        public DeviceState State { get; set; }

        [DataMember]        public DateTime StateTime { get; set; }    }

    public enum DeviceState    {        Unknown,        Working,        Broken    }}

(题外话:DemoData类中各个属性的写法有些偷懒,其实个人不建议这样。这里是为了代码简单……)

ServiceContracts.cs

using System.Collections.Generic;

using System.ServiceModel;

namespace WCFDemo.Contracts{    [ServiceContract]    public interface IDemoService    {        [OperationContract]        List<DemoData> GetMonitorData();    }}

第二步:服务

  1、添加一个类库WCFDemo.Services。

  2、在类库中加入一个文件Services.cs用来放置实现服务的类。

  3、添加引用WCFDemo.Contracts。

  4、编写代码如下:

using System;using System.Collections.Generic;

using WCFDemo.Contracts;

namespace WCFDemo.Services{    public class DemoService : IDemoService    {        Random random = new Random();

        public List<DemoData> GetMonitorData()        {            List<DemoData> r = new List<DemoData>();            r.Add(new DemoData() { ID = 1, Value = random.Next(100), ValueTime = DateTime.Now, State = DeviceState.Unknown, StateTime = DateTime.Now });            r.Add(new DemoData() { ID = 2, Value = random.Next(100), ValueTime = DateTime.Now, State = DeviceState.Working, StateTime = DateTime.Now });            r.Add(new DemoData() { ID = 3, Value = random.Next(100), ValueTime = DateTime.Now, State = DeviceState.Broken, StateTime = DateTime.Now });            return r;        }    }}

(题外话:第一步时说过DemoData的偷懒写法。如果DemoData中针对每个属性定义私有字段,并提供带参数的构造函数,构造函数中对字段赋值而不是对属性赋值,那么每个DemoData实例化时比这里的示例代码效率高。)

到这里,服务和契约已经完成。

剩下的就是宿主如何对外提供服务和客户端如何享受服务了,我们先使用最最简单的方式来实现。

我们先以最简单的方式来实现宿主和客户端:直接引用契约和服务项目、采用硬编码的方式。

第三步:宿主

  1、添加一个Windows窗体应用程序WCFDemo.Host.WithoutConfig。

  2、添加引用System.ServiceModel。

  3、引用之前的两个项目。

  4、在窗体放置两个Button和一个Label,并编写代码如下:

using System;using System.Windows.Forms;

using System.ServiceModel;using WCFDemo.Services;using WCFDemo.Contracts;

namespace WCFDemo.Host.WithoutConfig{    public partial class HostForm : Form    {        public HostForm()        {            InitializeComponent();        }

        ServiceHost host;

        private void button1_Click(object sender, EventArgs e)        {            host = new ServiceHost(typeof(DemoService));            host.AddServiceEndpoint(typeof(IDemoService), new BasicHttpBinding(), "http://localhost:5678/DemoService");            host.Opened += delegate { label1.Text = "服务启动"; };            host.Open();        }

        private void button2_Click(object sender, EventArgs e)        {            if (host != null && host.State == CommunicationState.Opened)            {                host.Closed += delegate { label1.Text = "服务停止"; };                host.Close();            }        }    }}

第四步:客户端

  1、添加一个Windows窗体应用程序WCFDemo.Client.WithoutConfig。

  2、添加引用System.ServiceModel。

  3、引用之前契约项目。

  4、在窗体放置一个Button和一个DataGridView,并编写代码如下:

using System;using System.Windows.Forms;

using System.ServiceModel;using WCFDemo.Contracts;

namespace WCFDemo.Client.WithoutConfig{    public partial class ClientForm : Form    {        public ClientForm()        {            InitializeComponent();        }

        private void button1_Click(object sender, EventArgs e)        {            using (ChannelFactory<IDemoService> f = new ChannelFactory<IDemoService>(new BasicHttpBinding(), "http://localhost:5678/DemoService"))            {                dataGridView1.DataSource = f.CreateChannel().GetMonitorData();            }        }    }}

时间: 2024-10-10 19:01:46

WCF初接触实作的相关文章

【瞎折腾系列】mysql存储过程初接触

开始[瞎折腾系列],这个系列纯属瞎折腾,可能没有什么实际意义. mysql存储过程生成表: 新建一张user表,包含id, username , password , usertable字段. 然后创建存储过程: create PROCEDURE create_table() BEGIN DECLARE n int DEFAULT 0; DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET

cglib初接触

直接上代码吧. pom添加依赖: <dependencies> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId

linux的初接触

最初衷:当自己的才能不能支配起内心的梦想时,便需要静下心来读读书.知道linux算一个巧合,但既然选择,那便努力一把.这是我的第一篇博文,也是我正式接触linux的所学.愿与大家共勉. ---Aolens 一,Linux比较常见的几个版本以及他们包含的常见的分支: 1,  Debian:ubuntu 2,  Slackware:s.u.S.E 3,  Redhat:CentOS,Fedora,HREL(centos的社区版,由centos调试一些软件是否成功来添加到HREL中         )

MyBatis初接触

参考MyBatis官方文档. 基本开发步骤: 一.导包,mybatis-3.2.7.jar: 二.编写实体类Customer.java(与数据库表对应): 三.编写实体类对应的mapper接口CustomerMapper.java(定义实体类的操作): 四.编写实体类对应的mapper,Customer.xml(接口中的方法名与mapper中的操作的id名要一致): 五.编写mybatis-config.xml: 六.在mybatis-config.xml中注册mapper: 七.从xml获取S

jfinal初接触,一个简单的文件上传例子

写了个上传的小例子. 从jfinal官网下载jfinal-1.8_demo_for_jsp.zip 然后下载jfinal-1.8-lib.zip 按要求删掉该删除的,引入一些包,之后的项目结构: DemoConfig.java中配置路由,只留下了根路径: /** * 配置路由 */ public void configRoute(Routes me) { me.add("/", CommonController.class); //me.add("/blog", B

java8 lambda表达式初接触

环境是jdk8 代码如下: package memTest; /** * Created by PC on 2014/8/5. */ public class LambdaOne { public static void test(){ new Thread(()-> System.out.print("hi") ).start(); } public static void main(String[] args) { new LambdaOne().test(); } } ja

vi初接触

它有三种模式: 一 一般模式 二 编辑模式 三 命令行模式 介绍几种比较常用的吧 -- 退出:q 写入:w 强制:! (以上可叠加) 显示行号:set nu 取消:set nonu 跳转到n行:nG 最后一行:G 第一行:gg(=1G) 向某个方向移动n个字符: 方向可以用方向键,也可以用 h(左),k(上),l(右),j(下) #向右移动5个字符 eg:5l 寻找词语:/word(向下) ?word(向下) 寻找x,y行之间的单词并替换:x,ys/word/WORD/g (加C可询问处理) #

【Centos 7】------ SaltStack 初接触

最近学习了saltstack,初接触,发现他好强大,有多强大? 说不好,我只接触了冰山一角,但已经够我喝一壶的了. 接下来,将探究saltstack的世界,能发现多少新大陆,看自己的能力啦! saltstack 介绍: Salt,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线,使其可以用于编配,远程执行, 配置管理等等. 一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报

软工实践练习-Git初接触

第一次听到Git,有点不知所云,听了实践课老师的讲解,才明白了Git作为最先进的分布式版本控制系统的重要性. 至于Git的安装和使用仍旧是自己摸索着去完成了,当然在这过程中也是遇到了很多的问题. 接下来就谈谈Git初接触的心得 1.注册 首先是要在https://github.com/上注册一个自己的账号,账号的注册就没什么可说的.填写用户名,邮箱,密码,然后sign up,这步是在机房时完成的. 2.Git的安装 下载Git,有很多的版本可以选择,我这边下载的是Git-2.5.1-64-bit