• 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();
    }
    }
    }
    }
    复制代码
  • 相关阅读:
    组合
    面向对象初识, 类名,对象的的使用, 类名称空间和对象名称空间
    内置函数2 递归函数
    内置函数~~~
    生成器 列表推导式 列表表达式
    函数名应用 闭包 迭代器
    函数 动态参数, 名称空间 作用域 取值顺序,函数的嵌套
    函数初识~~
    文件操作要点
    Mysql索引原理
  • 原文地址:https://www.cnblogs.com/parning/p/4274265.html
Copyright © 2020-2023  润新知