心静自然凉~

一杯清茶、二盏淡酒、邀三五知己,诉七八句心语,道九分珍重,怀十分真诚,或伤感、或快乐,无现实之隔阂 、无世俗之势利,如此人生,不亦乐乎!

导航

WCF 学习笔记(一)

Posted on 2008-01-16 22:50  Leo.Zhu  阅读(1759)  评论(1编辑  收藏  举报

最近一直忙着工作上的事,一直也没有给自己好好充充电了,突然感觉没有了灵感,唉~~

最近到微软的网站去看看了,发现WCF这个技术,之前就知道有这个东西了,但是一直也没有具体的看进去。所以打算在年前这几天的时间里好好学学这门技术。

以下是学习教程后的记录。

什么是WCF。

WCF的全称为Windows Communication Foundation,它提供了现有的比如WebService,.net Remoting,MessageQ,Enterprise Services 等的全部的功能。

WCF是面向服务的,松耦合的,分布式的,可交互的一个程序。

WCF可以很灵活的部署到不同的Host端上,可以采用不同的数据传输模式。可以灵活配置。

.Net FrameWork 3.0 ,Vista中包括。


Server端架构:

Host: 一个主机,该可以是一个windows form 程序,可以是一个windows Server程序,可以是一个com+程式 等等。

Service: 一个服务的对象。该就是一个用来处理具体逻辑的对象的定义。

EndPoint: 一个对外的点。该可以定位为不同的协议支持的。

Client端架构:

Client : Client的端的程式

Proxy: 一个代理对象。封装了SErvice 的对象。

EndPoint: 一个对Server端的一个点。

如下图:

wcf1

开始写一个简单的WCF程序:(包括3个部分,Server端部分,Client部分,Data部分)

以下创建一个基于Http协议的范例程序。

Data部分建立:

1.建立一个工程文件,该工程为一个Class Lib...,命名为:TESTWCF.MyData

2.引入 System.ServiceModel .dll.(这个好像在net3.0中有,net 2.0 要使用的wcf的话,需要安装net 3.0的环境,然后在装一个Visual Studio 2005 extensions for .NET Framework 3.0 这个,应该就可以了。 因为我之前有装过vs 2008 ,但是卸掉了,可能没有卸载干净,竟然还能使用这个.....也好省的麻烦了)

3.添加如下代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;

namespace TESTWCF.MyData
{
    [ServiceContract(Namespace = "http://www.cnblogs.net/zhucl1006")]
    public interface IMyDataService
    {
        [OperationContract]
        string GetServerTime(string userName);
    }

    public class MyDataService : IMyDataService
    {
        #region IMyDataService 成员

        public string GetServerTime(string userName)
        {
            string str = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            return "Server Time Is [" + str + "]. UserName is [" + userName + "]";
        }
        #endregion
    }
}

Server端建立:

1.建立一个工程文件。该工程为一个Window Form的程序。命名为:TESTWCF.HostServer

2.引入 System.ServiceModel .dll.

3.添加app.config 文件。如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="TESTWCF.MyData.MyDataService" behaviorConfiguration="serviceBehavior">
        <endpoint binding="basicHttpBinding" contract="TESTWCF.MyData.IMyDataService" address="MyData" />
        <endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080"/>
          </baseAddresses>
        </host>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

其中 Services 节点下表示该HOst中有几个Service服务。

Service节点下定义Service的内容。name:Service的命名空间,  behaviorConfiguration:定义行为属性的节点名称。

endpoint节点定义endpoint的内容,binding:定义使用协议,该范例中使用http协议。contract :定义endpoint使用的service类的名称。 address 定义访问的位置。

 

host: 定义host信息。baseAddresses:定义host中Address前面的部分。如果访问可以使用ie,输入baseAddress.Client要访问具体的服务,使用baseAddress+endpoint.address这个链接点。

serviceBehaviors: 行为定义。

4.设计窗体。略。

主要code:

ServiceHost host;

        private void button1_Click(object sender, EventArgs e)
        {
            host = new ServiceHost(typeof(TESTWCF.MyData.MyDataService));
            host.Opened += new EventHandler(host_Opened);
            host.Closed += new EventHandler(host_Closed);
            host.Open();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (host.State == CommunicationState.Opened)
            {
                host.Close();
                host.Opened -= new EventHandler(host_Opened);
                host.Closed -= new EventHandler(host_Closed);
            }
        }

void host_Closed(object sender, EventArgs e)
     {
         this.button1.Enabled = true;
         this.button2.Enabled = false;
     }

     void host_Opened(object sender, EventArgs e)
     {
         this.button1.Enabled = false;
         this.button2.Enabled = true;
     }

运行后,可以通过ie查看http://localhost:8080。如下图:

image

Client端建立:

1.建立一个工程文件。该工程为一个Windows Form程序,命名为:TESTWCF.MyClient

2.引入 System.ServiceModel .dll.

3.应该可以使用工具生成Service的代理类,我为了方便直接引入MyData.dll,使用ClientBase<>方法。

code如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.ServiceModel;
using TESTWCF.MyData;

namespace TESTWCF.MyClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        MyDataClient client = new MyDataClient();

        private void button1_Click(object sender, EventArgs e)
        {
            this.textBox1.Text = client.GetServerTime("Client");
        }
    }
    class MyDataClient : ClientBase<IMyDataService>, IMyDataService
    {

        internal MyDataClient()
            : base()

        { }

        #region IMyDataService 成员

        public string GetServerTime(string userName)
        {
            return this.Channel.GetServerTime(userName);
        }

        #endregion
    }
}

ClientBase 会根据app.config中定义创建适当的协议等,生成proxy。

 

4.添加app.config ,如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:8080/MyData" binding="basicHttpBinding"
                contract="TESTWCF.MyData.IMyDataService" />
    </client>
  </system.serviceModel>
</configuration>

 

定义Client端的endpoint。

 

 

运行结果:

image

可以看到ServerHost 和Client之间已经建立了链接。并获取到serverHost中的资料。

 

以上实现均使用WCF中的配置文件进行配置进行的。也可以通过代码直接,但是还是觉得配置的这个方法比较方便部署,更改等。 所以就写了这个方法。

 

学习代码下载

 


睡觉咯。明天还有还要继续处理VC的那个exe Com....现在架构已经出来了,界面显示也已经OK了,就差往里写逻辑部分了,也是最头疼的部分。明天加油。。。