第1章 WCF简介
面向服务架构(SOA)是近年来备受业界关注的一个主题,它代表了软件架构的一种方向。顺应SOA发展潮流,微软于2006年年底推出了一种新的分布式通信框架Windows Communication Foundation,简称WCF。WCF是作为.NET Framework3.0的一个组件发布的。
1.1 SOA基本概念和设计思想
SOA就是采用Web服务的架构吗?
面向服务(Service Orientation,SO)代表的是一种设计理念,和面向对象(Object Orientation,OO),面向组件(Component Orientation,CO)一样,体现的是一种对关注点进行分解的思想,面向服务是和技术无关的。
服务是自治的
服务的自治原则要求单个服务在底层逻辑控制方面尽可能是独立和自包含的,服务尽可能不依赖于访问它的客户端和其他服务。服务可以独立地进行部署及实施版本策略和安全策略。
SOA依赖于开发的标准
SOA的一个目标是让不同厂商开发的服务能够进行互操作。SOA采用基于消息的通信方式。SOA采用XML,XSD及WSDL作为服务描述的“语言”。
SOA支持跨平台
SOA鼓励创建可组合的服务
SOA鼓励服务的复用
SOA强调松耦合
1.2 WCF是对现有分布式通信技术的整合

      

        图1-1 WCF是对现有分布式通信技术的整合

1.3 构建一个简单的WCF应用
          
                    图1-2 客户端与服务进程之间的调用关系

                   
                    图1-3 WCF契约的类图
1.3.1 新建WCF服务
(1)、新建一个解决方案,ConsoleHost,同时新建一个控制台应用程序ConsoleHost。
(2)、添加一个类库 IService
新建一个接口ICalculator,注意添加服务引用,System.ServiceModel, 代码如下:
using System.ServiceModel;
namespace IService
{
[ServiceContract(Name="CalculatorService", Namespace="http://www.artech.com")]
public interface ICalculator
{
[OperationContract]
double Add(double x, double y);
}
}
(3)、添加一个类库 Service
新建一个类CalculatorService是实现接口ICalculator。代码如下:
using IService;

namespace Service
{
public class CalculatorService:ICalculator
{
public double Add(double x, double y)
{
return x + y;
}
}
}
(4)、完善 ConsoleHost 的代码
添加对Service类库的引用,代码如下:
using System;
using System.ServiceModel;
using Service; namespace ConsoleHost
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
host.Opened += delegate
{
Console.WriteLine("CalculatorService已经启动,按任意键终止服务!");
}; host.Open();
Console.Read();
}
}
}
}

添加配置文件App.config如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<serviceMetadata httpGetEnabled="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Service.CalculatorService" behaviorConfiguration="metadataBehavior">
<endpoint address="http://127.0.0.1:3721/calculatorservice"
binding="wsHttpBinding"
contract="IService.ICalculator"/>
</service>
</services>
</system.serviceModel>
</configuration>
(5)、Web宿主,添加新建项目,选择WCF服务应用程序,项目名称为 WebHost
添加对Service类库的引用,同时创建一个CalculatorService.svc文件,代码如下:
<%@ ServiceHost Language="C#" Debug="true" Service="Service.CalculatorService"%>

注意修改Web.config里面的代码,关键部分如下:

<system.serviceModel>
<services>
<service name="Service.CalculatorService" behaviorConfiguration="WebHost.Service1Behavior">
<!-- Service Endpoints -->
<endpoint address="" binding="wsHttpBinding" contract="IService.ICalculator">
<!--
部署时,应删除或替换下列标识元素,以反映
在其下运行部署服务的标识。删除之后,WCF 将
自动推导相应标识。
-->
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WebHost.Service1Behavior">
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点-->
<serviceMetadata httpGetEnabled="true" />
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
1.3.2 运行WCF服务
(1)、运行控制台宿主服务
  控制台运行WCF服务比较简单,之间运行ConsoleHost项目启动即可,运行成功如下图:

      

(2)、部署IIS上的WCF服务
  第一步、添加网站

       

  第二步、修改版本

      

  第三步、启动IIS成功

    

1.3.3 客户端调用WCF服务
新建一个解决方案WCFClient,添加一个控制台项目WCFClient。在解决方案下面新建一个文件夹DLL,将IService的dll,拷贝到DLL文件夹下,并添加对IService的引用,同时还要添加对System.ServiceModel的引用,代码如下:
using System;
using System.ServiceModel;
using IService; namespace WCFClient
{
class Program
{
static void Main(string[] args)
{
using(ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorservice"))
{
ICalculator proxy = channelFactory.CreateChannel();
Console.WriteLine("3 + 1 = {0}", proxy.Add(, ));
}
Console.Read();
}
}
}

  App.config文件的代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint name="calculatorservice"
address="http://127.0.0.1:3721/calculatorservice"
binding="wsHttpBinding"
contract="IService.ICalculator"
/>
</client>
</system.serviceModel>
</configuration>

  配置文件配的是调用控制台宿主的WCF服务,如果要调用IIS的WCF就把黄色部分的代码改为:http://127.0.0.1:8024/CalculatorService.svc,Console的端口号是在ConsoleHost项目下的App.config中配置的,而IIS的端口号是搭建Web的时候,配置的。

  运行结果如下:

  

WCF全面解析
amy
2014年09月16日

第1章WCF简介(WCF全面解析读书笔记2)的更多相关文章

  1. 《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  2. 《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  3. Activity源码解析 - 读书笔记

    1. Activity启动 Activity是一个比较好的模板方法模式.在Android系统启动时,第一个启动的进程是zygote进程,然后由zygote启动SystemServer,再后就是启动AW ...

  4. WCF完全解析读书笔记第2章地址

    1. 使用同一个绑定对象实现地址跨终结点共享 2. 地址报头帮助辅助寻址 3. 使用端口共享为多个服务使用相同端口 4. WCF终结点地址分为逻辑地址和物理地址, 客户端使用ClientViaBeha ...

  5. Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  6. Java核心技术卷一基础知识-第3章-Java的基本程序设计结构-读书笔记

    第3章 Java的基本程序设计结构 本章内容: 一个简单的Java应用程序 字符串 注释 输入输出 数据类型 控制流 变量 大数值 运算符 数组 本章主要讲述程序设计相关的基本概念(如数据类型.分支以 ...

  7. Javascript模式(第三章字面量与构造函数)------读书笔记

    一 对象字面量 1.1对象字面量的语法 1,对象键值对哈希表,在其他的编程语言中称之为“关联数组”, 2 键值对里面的值,可以是原始类型也可以是其他类型的对象,称之为属性,函数称之为方法 3 自定义对 ...

  8. 《第一本docker书》第4章 使用docker镜像和仓库 读书笔记

    docker最底端是一个引导文件系统,即bootfs. 第二层是root文件系统rootfs,位于引导文件系统之上. 在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并 ...

  9. Java深入解析读书笔记(一)

    1. goto,const为java的两个保留关键字,无任何应用语法.因此从不使用.   goto 使用循环标签:if,break out,here实现goto的功能. 2. 标识符:可由字母数字下划 ...

随机推荐

  1. VBA遍历单元格

    Sub test() Dim str Dim i, j i = j = ).UsedRange.Rows.Count ).UsedRange.Columns.Count ).Cells(r, c).V ...

  2. android 自己定义checkbox 背景图无效的问题

    http://blog.csdn.net/zuolongsnail/article/details/7106586  正常的定义能够參考这个网址  可是我參考它以后发现我执行时候 根本不工作嘛  结果 ...

  3. Go编译安装

    go编译安装: 设置环境变量 # sudo vim /etc/profile.d/go export GOROOT=/home/evescn/go export PATH=$PATH:$GOROOT/ ...

  4. 【转】redis GEO地理位置

    redis目前已经到了3.2版本,3.2版本里面新增的一个功能就是对GEO(地理位置)的支持. 地理位置大概提供了6个命令,分别为: GEOADD GEODIST GEOHASH GEOPOS GEO ...

  5. NetCore下模拟和使用Modbus工业通信协议

    Tips: 1.目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net  https://github.com/parallelbgls/Modbus.Net 2.modbus是 ...

  6. winform下实现pictureBox全屏播放

    最近开发一个项目,需要通过双击pictureBox实现全屏的功能,网上查找资料,加上一点摸索,最终实现了.做一下记录,以备以后需要. 主要功能都在下面这个类里面 using System; using ...

  7. 【Leetcode 338】 Counting Bits

    问题描述:给出一个非负整数num,对[0, num]范围内每个数都计算它的二进制表示中1的个数 Example:For num = 5 you should return [0,1,1,2,1,2] ...

  8. GOF23设计模式之迭代器模式(iterator)

    一.迭代器模式概述 提供一种可以遍历聚合对象的方式.又称为:游标(cursor)模式 结构: (1)聚合对象:存储数据 (2)迭代器:遍历数据 二.迭代器模式示例代码 定义:正向遍历迭代器和逆向遍历迭 ...

  9. centos初始化安装

    1.yum 安装 nginx rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6. ...

  10. Java Scanner 类,获取用户输入的值

    Scanner 类使用步骤 1.导入java.util.Scanner import java.util.Scanner; 2.创建Scanner对象 Scanner scan = new Scann ...