原文系列来自http://www.cnblogs.com/yank/p/3653160.html

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)、生成客户端应用程序。

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启动

Client运行结果

5、源码地址:

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

(转)WCF入门教程(一)简介的更多相关文章

  1. WCF入门教程(一)简介

    WCF入门教程(一)简介 1.WCF是什么? WCF( Windows Communication Foundation), 是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NE ...

  2. WCF入门教程(五)配置文件

    WCF入门教程(五)配置文件 服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用. 承载服务有两种方式,一种通过配置文件,一种通过代码进行配置.上一章已经介绍了代码方 ...

  3. WCF入门教程(四)通过Host代码方式来承载服务

    WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...

  4. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  5. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  6. WCF入门教程(三)定义服务协定--属性标签

    WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...

  7. WCF入门教程(二)如何创建WCF服务

    WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...

  8. 无废话WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  9. WCF入门教程(二)从零做起

    通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) 定义了协议,具体什么操作,操作的参数和返回值 ...

  10. WCF入门教程(图文)VS2012

    WCF入门教程(图文)VS2012 上一遍到现在已经有一段时间了,先向关注本文的各位“挨踢”同仁们道歉了.小生自认为一个ITer如果想要做的更好,就需要将自己的所学.所用积极分享出来,接收大家的指导和 ...

随机推荐

  1. java编程小技巧

    1.缩进与反缩进 缩进:tab 反缩进:shift+tab 2.整段注释和取消整段注释 整段注释:ctrl+shift+/ 取消整段注释:ctrl+shift+\

  2. javascript sort()与reverse()

    javascript 中提供了两个对数据进行排序的方法,即sort()和reverse() 在理解的时候犯了一个非常低级的错误,现记录如下: reverse()不包括排序的功能,只是把原来的数组反转. ...

  3. 转:测试用书(出处:cnblog--liangshi)

    列表格式为:图书分类.中文书名.英文书名.作者.排名不分先后,用红色标记出我推荐的书籍. 测试入门 软件测试(第2版) Software Testing (2e), Ron Patton 一本测试入门 ...

  4. JQUERY1.9学习笔记 之基本过滤器(一) 动态选择器

    动态选择器:animated Selector 描述:当选择器运行时,选择动态进程中的所有元素.(对动态进程起作用) jQuery( ":animated" ) 注释::anima ...

  5. 按钮点击效果jquery

    <html><head> <meta charset="UTF-8"> <title>QQ</title> <me ...

  6. JBPM4.4GPD设计器中文乱码问题的另一种解决方法

    在eclipse中使用JBPM4.4的设计器时,输入中文后直接查看Source发现xml里中文全都乱码了,这时候大约整个人都不好了!赶紧百度.谷歌,搜到的多数结果都是要你在eclipse.ini或my ...

  7. 可控制转速CSS3旋转风车特效

    以前制作网页动画一般使用javascript,现在已经有越来越多动动画使用纯CSS实现,并且动画的控制也可以使用CSS3实现,因为CSS 3来了,CSS 3的动画功能确实强大.以下是一个纯CSS3制作 ...

  8. http协议的各个版本及区别

      这个东西在一篇博文上面看见的,谢谢原博主提供!又学习了...

  9. rsyslog 直接kill进程,在重新启动会全部发送日志

    <pre name="code" class="html">jrhapt11:/root# ps -ef | grep rsyslog root 8 ...

  10. chrome浏览器测试js函数

    1.直接在console中写入代码 2.既要写函数,又要写执行函数的代码. 不关闭网页,函数能够在内存中存活很久 浏览器都能记住函数. 当然,在其他页面无效.