WCF入门教程(一)简介

摘要:
WCFService由一个端点集组成。每个端点都是通信的入口。客户端和服务器通过端点交换信息。为了方便记忆,我们通常将这三个部分称为WCF的ABC。AddressAddress通过URI唯一标识端点,并告知潜在WCF服务调用方如何查找端点。BehaviorBehavior:行为主要用于在运行时自定义Endpoint的一些必要行为。例如,服务调用客户端的超时;客户采用的凭证类型;以及是否支持事务。

1、WCF是什么?

WCF( Windows Communication Foundation), 是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NET Framework 3.5的重要组成部分。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。

简单的说:WCF就是分布式通信框架。 

2、WCF主要构成

Endpoint

Endpoint是WCF实现通信的核心要素。一个WCF Service由一个Endpoint集合组成,每个Endpoint就是用于通信的入口,客户端和服务端通过Endpoint交换信息。
Endpoint由三部分组成:Address,Binding,Contract。便于记忆,我们往往将这三部分称为是WCF的ABC。
Address

Address通过一个URI唯一地标识一个Endpoint,并告诉潜在的WCF service的调用者如何找到这个Endpoint。

Binding

Binding实现在Client和Service通信的所有底层细节。比如Client与Service之间传递的Message是如何编码的—— text/XML, binary,MTOM;这种Message的传递是采用的哪种Transport——TCP, Http, Named Pipe, MSMQ; 以及采用怎样的机制解决Secure Messaging的问题——SSL,Message Level Security。所以Binding解决的是How to communicate with service?

Contract

Contract的主要的作用是定义通信协议,具体Service提供了哪些方法。

Behavior

Behavior: Behavior的主要作用是定制Endpoint在运行时的一些必要的Behavior。比如Service回调Client的Timeout;Client采用的Credential type;以及是否支持Transaction等。

3、WCF构建流程

(1)、定义服务协定。 服务协定指定服务的签名、服务交换的数据和其他协定要求的数据
(2)、实现协定。 若要实现服务协定,请创建实现协定的类并指定运行时应具有的自定义行为。
(3)、通过指定终结点和其他行为信息来配置服务
(4)、承载服务
(5)、生成客户端应用程序。

 WCF入门教程(一)简介第1张

4、简单实例

 通过最简单的计算器功能来解释具体的实现过程

1)首先定义契约,这个协议就是定义通信接口

复制代码
    /// <summary>
    /// 计算协议
    /// </summary>
    [ServiceContract(Namespace = "http://www.yank.com/")]
    public interface ICalculator
    {
        /// <summary>
        ////// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        [OperationContract]
        double Add(double x, double y);
        /// <summary>
        ////// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        [OperationContract]
        double Subtract(double x, double y);
        /// <summary>
        ////// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        [OperationContract]
        double Multiply(double x, double y);
        /// <summary>
        ////// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        [OperationContract]
        double Divide(double x, double y);
    }
复制代码

2)通过具体类实现接口功能

复制代码
    /// <summary>
    /// 计算器具体实现
    /// </summary>
    public class CalculatorService : ICalculator
    {
        /// <summary>
        ////// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public double Add(double x, double y)
        {
            return x + y;

        }
        /// <summary>
        ////// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public double Subtract(double x, double y)
        {
            return x - y;
        }
        /// <summary>
        ////// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public double Multiply(double x, double y)
        {
            return x * y;
        }
        /// <summary>
        ////// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public double Divide(double x, double y)
        {
            return x / y;
        }
    }
复制代码

3)根据契约(Contract),绑定(Binding)和地址(Address),创建服务节点(ServiceEndPoint)

4)将服务节点承载在主机(Host)中,例子将host承载在一个控制台程序中。

复制代码
            #region 采用代码方式实现对契约的绑定
            Uri baseAddress = new Uri("http://127.0.0.1:9999/");
            using (ServiceHost host = new ServiceHost(typeof(CalculatorService), baseAddress))
            {
                //使用指定的协定、绑定和终结点地址将服务终结点添加到承载服务中
                host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");

                #region Behavior
                ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                behavior.HttpGetEnabled = true;
                behavior.HttpGetUrl = new Uri("http://127.0.0.1:9999/CalculatorService/metadata");
                host.Description.Behaviors.Add(behavior);
                #endregion

                host.Opened += delegate
                {
                    Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                };

                host.Open();
                Console.Read();
            }
            #endregion
复制代码

5)客户端调用,通过Channel方式调用

复制代码
namespace ClientWithChannel
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:9999/CalculatorService"))
            {
                ICalculator proxy = channelFactory.CreateChannel();

                using (proxy as IDisposable)
                {
                    Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, proxy.Add(1, 2));
                    Console.WriteLine("x - y = {2} when x = {0} and y = {1}", 1, 2, proxy.Subtract(1, 2));

                    Console.WriteLine("x * y = {2} when x = {0} and y = {1}", 1, 2, proxy.Multiply(1, 2));
                    Console.WriteLine("x / y = {2} when x = {0} and y = {1}", 1, 2, proxy.Divide(1, 2));

                    Console.ReadLine();
                }

            }
        }
    }
}
复制代码

6)运行Host的Console程序,将服务启动,进行监听,然后启动客户端程序测试调用。

Host启动

WCF入门教程(一)简介第10张

Client运行结果

WCF入门教程(一)简介第11张

 

 5、源码地址:

http://files.cnblogs.com/yank/WCFServices.zip

免责声明:文章转载自《WCF入门教程(一)简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux系统寻找僵尸进程android DHCP流程【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MyCat 学习笔记 第十二篇.数据分片 之 分片事务处理

1 环境说明 VM 模拟3台MYSQL 5.6 服务器    VM1 192.168.31.187:3307    VM2 192.168.31.212:3307    VM3 192.168.31.150:  3307 MYCAT 1.5 服务部署在宿主机上   MYCAT 192.168.31.207 :8806【SQL执行端口】 / 9066【管理端...

Ansible进阶

YAML YAML简介   YAML是一个可读性高,并用来表达资料序列的格式。YAML参考了其它多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等   它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言 YAML特性   YAML的可读性好   ...

TinyFrame升级之十:WCF Rest Service注入IOC的心

由于在实际开发中,Silverlight需要调用WebService完成数据的获取,由于之前我们一直采用古老的ASMX方式,生成的代理类不仅难以维护,而且自身没有提供APM模式的调用方式,导致在Sinverlight中实现线程同步,非常的困难。所以这里我采用了WCF Restful Service来完成。 这里我们需要新建一个WCF Rest Servic...

rabbitmq消费端加入精确控频。

控制频率之前用的是线程池的数量来控制,很难控制。因为做一键事情,做一万次,并不是每次消耗的时间都相同,所以很难推测出到底多少线程并发才刚好不超过指定的频率。 现在在框架中加入控频功能,即使开200线程,也能保证1秒钟只运行10次任务。 里面的rabbitpy后来加的,然来是使用pika的,就框架本身得实现写法上违反了开闭原则,没设计太好。好在不影响调用方式...

Python+paramiko实现绕过跳板机免密登录服务端

  前提,服务端和客户端已配置公钥、私钥,详情可参见: ssh-keygen生成公钥私钥 详见代码: import paramiko # 服务器信息 host = {"host": " ", "port": , "username": " "} private_key = paramiko.RSAKey.from_private_key_file('...

zabbix详解(一)

zabbix简介 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供柔软的通知机制以让系统管理员快速定位/解决存在的各种问题。 zabbix由3部分构成,zabbixserver、可选组件zabbix proxy、可选组件zabbix agent。...