WCF学习笔记

简介: http://www.cnblogs.com/zhucl1006/archive/2008/01/16/1042092.html 最近一直忙着工作上的事,一直也没有给自己好好充充电了,突然感觉没有了灵感,唉~~ 最近到微软的网站去看看了,发现WCF这个技术,之前就知道有这个东西了,但是一直也没有具体的看进去。

http://www.cnblogs.com/zhucl1006/archive/2008/01/16/1042092.html

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

最近到微软的网站去看看了,发现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了,就差往里写逻辑部分了,也是最头疼的部分。明天加油。。。

0
0
0
(请您对文章做出评价)
相关文章
silverlight:wcf双工通讯学习笔记
一直觉得SL中的wcf双工通讯方式有点鸡肋,如果是以http方式实现则效率太低,如果用SL4中的tcp方式实现,又跟socket太雷同,所以一直没去研究,不过这东西在对性能要求不高时(比如在网页上每5分钟更新一次天气预报/股票信息),实现起来还是蛮方便的.wcf双工通讯与传统的wcf相比,最大的区别就是:传统的wcf通常都是客户端去调服务,即客户端从服务端上“拉”信息,而双工通讯除了允许客户端从服务端"拉"信息外,服务端还能主动向客户端“推”送信息。
1133 0
|
JSON JavaScript 前端开发
ExtJs学习笔记(20)-利用ExtJs的Ajax与服务端WCF交互
ExtJs是一套非常不错的javascript UI库(第一次接触ExtJs的,可到官方网站http://www.extjs.com/deploy/dev/examples/samples.html看下示例。
1307 0
|
SQL JavaScript 前端开发
ExtJs学习笔记(21)-使用XTemplate结合WCF显示数据
个人认为,XTemplate是ExtJs中最灵活的用来显示数据的组件,有点类似aspx中的Repeater控件,显示数据的模板完全可以由用户以html方式来定制.   先给一个官方的静态示例(稍微改了下),代码并不复杂,关键的地方,我已经注释了  1     2        Ext.
1229 0
|
JSON JavaScript 前端开发
ExtJs学习笔记(22)-XTemplate + WCF 打造无刷新数据分页
ExtJs的Grid组件虽然不管从哪一方面来讲,都称得上是很好很强大,但是总会有一些应用场景并不需要这么多功能,比如网站的留言列表,开发者只想要一个简单的或列表而已,这时候XTemplate就显得很有用了。
1490 0
|
JSON 前端开发 JavaScript
ExtJs学习笔记(23)-ScriptTagProxy+XTemplate+WCF跨域取数据
ajax应用中跨域一直是一个非常麻烦的问题,目前也有一些解决办法,但要么比较麻烦,要么就不具备通用性,幸好ExtJs里的ScriptTagProxy提供了跨域读取数据的功能,而且在几大浏览器上都可以正常运行,但在使用过程中要注意几点: 1.
1318 0
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一