1.WCF中的 "A","B","C" 介绍

  我们先看个生活中的例子,某一天,公司的领导让你去送一份合同文件,送文件的过程你可以选择的交通方式为“打车”、“公交”、“地铁”,当然费用是根据发票来报销的,到了对方公司后你要找到某经理,并且要一份收到合同文件的回执和相关文件。

  要完成这项工作任务我们执行以下几个主要的步骤:

  (1)我们首先要知道对方公司的地址,引出WCF中的"A"。

  A(Address):英文理解为"地址",在计算机中是通过一个URI唯一地址标识,通过这个地址我们可以找到我们要调用的WCF服务。

  A解决了:Where to locate the WCF Service?

  (2)我们还要选择我们的交通方式,每种交通方式达到的结果不一样。如:打车费用较贵、但是过程舒服些,时间上视道路情况而定。公交最便宜,并且可选择多条线路。地铁最方便,但是偶尔会很挤,一般都没座等等,引出WCF中的"B"。

  B(Binding):英文理解为"捆绑,绑定", Binding实现在Client和Service通信的所有底层细节。如:我们在客户端与服务端传输的时候采用的是什么样的编码,XML?Text?二进制?...采用哪种传输协议进行传输,TCP?Http?以及采用什么样的机制解决安全问题,SSL?加密?...

  B解决了:How to communicate with service?

  (3)到了对方公司之后我们能做哪些事?I.送合同,II.拿回执。我们不能要求对方公司给我们其他的东西,引出WCF中的"C"。

  C(Contract):英文理解为"合同",合同是什么?告诉我们哪些事能做,如些事不能做。 Contract的主要的作用是暴露某个WCF Service所提供的所有有效的方法。Contract实际上是把每个方法的转化成为相对应的消息。

  C解决了:What functionalities do the Service provide?

2.简化WCF的配置

我们可以通过单击“工具”--“WCF服务配置编辑器”,开启WCF服务配置编辑器。

3.构建一个简单的WCF应用

接口ICalculator

[ServiceContract(Name = "CalculatorService", Namespace ="http://www.wzl.com/")]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double x, double y);
        [OperationContract]
        double Subtract(double x, double y);
        [OperationContract]
        double Multiply(double x, double y);
        [OperationContract]
        double Divide(double x, double y);
    }

实现接口Service

public class CalculatorService : ICalculator
    {
        public double Add(double x, double y)
        {
            return x + y;
        }
        public double Subtract(double x, double y)
        {
            return x - y;
        }
        public double Multiply(double x, double y)
        {
            return x * y;
        }
        public double Divide(double x, double y)
        {
            return x / y;
        }

第一种:

Host启用服务:不需要任何配置文件

 static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
            {
                host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(),"http://127.0.0.1:3721/calculatorservice");
                if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
                {
                    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                    behavior.HttpGetEnabled = true;
                    behavior.HttpGetUrl = new Uri("http://127.0.0.1:3721/calculatorservice/metadata");
                    host.Description.Behaviors.Add(behavior);
                }
                host.Opened += delegate
                {
                    Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                };

                host.Open();
                Console.Read();
            }
        }

Client调用:通过添加服务引用的方式(右键引用-添加服务引用)

 static void Main(string[] args)
        {
            using (CalculatorServiceClient proxy = new CalculatorServiceClient())
            {
                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.Read();
        }

第二种:

Host启用服务:通过配置文件

 <system.serviceModel>
     <behaviors>
       <serviceBehaviors>
         <behavior name="metadataBehavior">
           <serviceMetadata httpGetEnabled="true"
                            httpGetUrl="http://127.0.0.1:3721/calculatorservice/metadata" />
         </behavior>
       </serviceBehaviors>
     </behaviors>
     <services>
       <service name="Artech.WcfServices.Service.CalculatorService"
                behaviorConfiguration="metadataBehavior" >
         <endpoint address="http://127.0.0.1:3721/calculatorservice"
                   binding="wsHttpBinding"
                   contract="Artech.WcfServices.Service.Interface.ICalculator" />
       </service>
     </services>
   </system.serviceModel>

启用

  static void Main(string[] args)
         {
             using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
             {
                 host.Opened += delegate
                 {
                     Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                 };

                 host.Open();
                 Console.Read();
             }
         }

Client调用:

  static void Main(string[] args)
         {
             using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:3721/calculatorservice"))
             {
                 ICalculator proxy = channelFactory.CreateChannel();
                 Console.WriteLine(, , proxy.Add(, ));
                 Console.WriteLine(, , proxy.Subtract(, ));
                 Console.WriteLine(, , proxy.Multiply(, ));
                 Console.WriteLine(, , proxy.Divide(, ));
             }
             Console.Read();
         }

第三种:

Host启用服务:通过配置文件

   <system.serviceModel>
     <behaviors>
       <serviceBehaviors>
         <behavior name="metadataBehavior">
           <serviceMetadata httpGetEnabled="true"
                            httpGetUrl="http://127.0.0.1:3721/calculatorservice/metadata" />
         </behavior>
       </serviceBehaviors>
     </behaviors>
     <services>
       <service name="Artech.WcfServices.Service.CalculatorService"
                behaviorConfiguration="metadataBehavior" >
         <endpoint address="http://127.0.0.1:3721/calculatorservice"
                   binding="wsHttpBinding"
                   contract="Artech.WcfServices.Service.Interface.ICalculator" />
       </service>
     </services>
   </system.serviceModel>

启用

 static void Main(string[] args)
         {
             using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
             {
                 host.Opened += delegate
                 {
                     Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                 };

                 host.Open();
                 Console.Read();
             }
         }

Client调用:通过配置文件

   <system.serviceModel>
     <client>
       <endpoint name="calculatorservice"
                 address="http://127.0.0.1:3721/calculatorservice"
                 binding="wsHttpBinding"
                 contract="Artech.WcfServices.Service.Interface.ICalculator"  />
     </client>
   </system.serviceModel>

调用

 static void Main(string[] args)
         {
             using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorservice"))
             {
                 ICalculator proxy = channelFactory.CreateChannel();
                 Console.WriteLine(, , proxy.Add(, ));
                 Console.WriteLine(, , proxy.Subtract(, ));
                 Console.WriteLine(, , proxy.Multiply(, ));
                 Console.WriteLine(, , proxy.Divide(, ));
             }
             Console.Read();
         }

第四种:通过发布部署到IIS的方式

WCF全面解析第一章 WCF 简介的更多相关文章

  1. 第一章 C++简介

    第一章  C++简介 1.1  C++特点 C++融合了3种不同的编程方式:C语言代表的过程性语言,C++在C语言基础上添加的类代表的面向对象语言,C++模板支持的泛型编程. 1.2  C语言及其编程 ...

  2. python 教程 第一章、 简介

    第一章. 简介 官方介绍: Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使 ...

  3. 学习笔记-[Maven实战]-第一章:Maven简介

    Maven简介: Maven 可翻译为:知识的积累,也可以翻译为"专家"或"内行". Maven 是一个跨平台的项目管理工具,是Apache组织中一个很成功的开 ...

  4. 《跟我学Shiro》学习笔记 第一章:Shiro简介

    前言 现在在学习Shiro,参照着张开涛老师的博客进行学习,然后自己写博客记录一下学习中的知识点,一来可以加深理解,二来以后遗忘了可以查阅.没有学习过Shiro的小伙伴,也可以和我一起学习,大家共同进 ...

  5. 《JavaScript高级程序设计》——第一章JavaScript简介

    第一章主要讲了JavaScript的诞生和发展.刚刚接触JavaScript的我,似乎对这些内容并不感兴趣,快速看了一遍就开始去看第二章了. 看完第一章,收获也就是了解到JavaScript由ECMA ...

  6. WCF全面解析第二章 地址(Adress)

    2.1 统一资源标识(URL) 2.1.1 Http/Https 2.1.2 Net.TCP 2.1.3 Net.Pipe WCF只将命名管道专门用于同一台机器的跨进程通信. 2.1.4 Net.Ms ...

  7. NancyFX 第一章 NancyFX 简介

    Nancy是.NET 平台的微框架.在受到Ruby社区的Sinatra框架启发下,NancyFx框架提供一个.NET平台下的低门槛.易上手的可用于Web开发工具包. 请注意我说的是可用于Web开发,这 ...

  8. 第一章 Shiro简介——《跟我学Shiro》(转)

    目录贴:跟我学Shiro目录贴 1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可 ...

  9. 第一章 Mysql 简介及安装和配置

    Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一. ...

随机推荐

  1. ibatis配置多表关联(一对一、一对多、多对多)

    iBatis的多表关联. ibatis的表关联,和数据库语句无关,是在程序中,把若干语句的结果关联到一起.这种关联形式,虽然在大数据量时是很奢侈的行为,但是看起来很干净,用起来也很方便. 这里用表lo ...

  2. [VB.NET]拖动操作的技术基础

    1.设置需要接受拖动事件的控件的AllowDrop属性为True,在开发界面时配置,不可通过代码配置 2.在DragEnter事件处理程序里,为e.Effet设置枚举值,否则拖动无效 Private ...

  3. 在word中做复选框打对勾钩

    在word中做复选框打对勾钩 现在终于搞明白正确的操作方法 一.你在word里输入2610,按alt+X就能出 空checkbox 你在word里输入2611,按alt+X就能出 打了勾的checkb ...

  4. Win8系统 Python安装 - 入门

    原文:http://www.blogbus.com/hx1987-logs/271955446.html 安装python (1)下载python安装包,下载网站https://www.python. ...

  5. [ CodeVS冲杯之路 ] P3955

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好 ...

  6. 【练习】如何显示本地主机上的MySQL客户机版本

    在终端窗口以oracle用户身份登录 [root@enmo ~]# su - oracle [oracle@enmo ~]$ mysql -V mysql Ver , for Linux (x86_6 ...

  7. 常见行为:仿真&重力&碰撞&捕捉

    一.UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架.可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象,重力.弹性碰撞等,游戏开发中很常见,例如愤怒的小鸟. 二.UI ...

  8. VC与JavaScript交互(二) --- 调用JS函数

    这一章,我们来动手实践VC调用JS函数. 我们动手写一个HTML,其中包含这样一段JS代码: //[html] <script type="text/javascript"& ...

  9. play framework 框架安装及myeclipse 导入项目

    下载 play framework 框架. 解压你你要解压的目录 E:\play-1.2.7 相对其他的WEB框架.play的配置是相当简单的.没有那么多配置文件的搞法.上手比较快,就是相关的资料比较 ...

  10. java 命令行操作

    打包命令 例如:将testproject下的文件打包成test.war jar cvf test.war ./testproject