第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. nginx ngscript 简单使用

    备注: 默认没有集成到nginx包里,需要单独安装(推荐使用动态模块的方式进行安装) 1. 安装 wget https://nginx.org/download/nginx-1.13.11.tar.g ...

  2. 一款直接时空处理分析的开源数据库---geomesa

    一款直接时空处理分析的开源数据库---geomesa,可用于交通轨迹数据存储分析等相关领域, 在分布式列数据库的基础上进行扩展,目前支持Accumulo, HBase, Cassandra, and ...

  3. 在使用windows调用Hadoop 错误 /bin/bash: line 0: fg: no job control一般解决方法

    在使用windows调用Hadoop yarn平台的时候,一般都会遇到如下的错误: 2014-05-28 17:32:19,761 WARN org.apache.hadoop.yarn.server ...

  4. Hadoop序列化与Writable接口(二)

    Hadoop序列化与Writable接口(二) 上一篇文章Hadoop序列化与Writable接口(一)介绍了Hadoop序列化,Hadoop Writable接口以及如何定制自己的Writable类 ...

  5. centos7下安装docker 17.x

    docker的17.X版本与以前的docker安装有些不同,参考了下这篇文章http://www.itmuch.com/docker/docker-2/,以下是我的docker 17.X版本安装过程, ...

  6. .NET的URL重写

    [概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力:而且在你改变了 ...

  7. idea 破解代码

    下面是idea的破解方法,手动执行对应的main方法即可.亲测Idea 14 完美破解~~废话少说,上代码... package com.jd.serializable; import java.ma ...

  8. Hadoop MapReduce 初步学习总结

    在Hadoop中一个作业被提交后,其后具体的执行流程要经历Map任务的提交中间结果处理,Reduce任务的分配和执行直至完成这些过程,下面就是MapReduce中作业详细的执行流程图(摘自<Ha ...

  9. python学习(二十二) Python 中boolean

  10. 学生党如何拿到阿里技术offer: 《2016阿里巴巴校招内推offer之Java研发工程师(成功)》

    摘要: 这篇文章字字珠玑,这位面试的学长并非计算机相关专业,但是其技术功底足以使很多计算机专业的学生汗颜,这篇文章值得我们仔细品读,其逻辑条理清晰,问题把握透彻,语言表达精炼,为我们提供了宝贵的学习经 ...