第1章WCF简介(WCF全面解析读书笔记2)

第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(3, 1));
            }
            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日

时间: 2024-10-13 12:18:30

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

Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.Android源代码中包含了HAL(即硬件抽象层) 的代码,并学习了如何搭建这两种开发环境. Android 的移植的本质就是Linux内核的移植,Linux内核的移植主要是Linux驱动的移植.而开发和测试Linux驱动就需要安装以上两个开发环境. 搭建两套环境的具体步骤如下: 一.下载编译和测试A

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

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 1.引言 具有本地磁盘的系统引导

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

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

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

第一章 Thread导论 为何要用Thread ? 非阻塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机执行的应用程序任务(task). 只有一个线程的例子: public class Factorial { public static void main(String[] args) { int n = 5; System.ou

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

docker最底端是一个引导文件系统,即bootfs. 第二层是root文件系统rootfs,位于引导文件系统之上. 在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,它才会被切换为读写模式.但是在docker里,root文件系统永远只能是只读状态,并且docker利用联合加载技术又会在root文件系统层上加载更多的只读文件系统.联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统.联合加载将各层文件系统叠加到一起,这

《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记

一.为什么GUI是单线程化 传统的GUI应用程序通常都是单线程的. 1. 在代码的各个位置都须要调用poll方法来获得输入事件(这样的方式将给代码带来极大的混乱) 2. 通过一个"主事件循环(Main Event Loop)"来间接地运行应用程序的全部代码. 假设在主事件循环中调用的代码须要非常长时间才干运行完毕,那么用户界面就会"冻结",直到代码运行完毕.这是由于仅仅有当运行控制权返回到主事件循环后,才干处理兴许的用户界面事件. 非常多尝试多线程的GUI框架的努力

第四章 源代码的下载与编译 - 读书笔记

Android驱动月考4 1.配置Android源代码下载环境 创建文件以及配置路径 PATH 使用curl或者wget方式下载脚本 并且赋予权限于~/bin/repo 创建Android源代码的目录以及初始化init,并且开始下载源代码,也可以下载源代码的一部分. 2.使用git clone从Googlesource把Android源代码项目克隆到本地. 3.编译,这里比较重要,运行envsetup.sh安装的shell脚本,之后进行之后的安装步骤接模拟器. 4.下载和编译linux内核的源代

第三章:Git使用入门的读书笔记

由于涉及源代码,就需要对源代码进管理.Linux内核代码及很多著名的项目都使用了Linux之父linus编写的Git进行源代码管理.Linus以一个文件系统专家和内核设计者的视角对Git进行设计,其独特设计让Git拥有非凡的性能和最为优化的存储能力,Git在各方面都优于其他同类的源代码管理软件.Android和Linux内核.驱动开发的过程中会涉及大量的源代码,而这些源代码基本都由Git管理. 1. 安装Git:一般Linux都自带Git, 一般情况下都使用的是:Ubuntu Linux10.1

NoSQL简介(NoSQL Distilled读书笔记)

随着NoSQL的流行,了解这种新型数据库十分有必要. 首先,为什么我们要选择NoSQL? 主要是两个原因:一是待处理的数据量很大,或对数据访问的效率要求很高,从而必须将数据放在集群上:二是想采用一种更为方便的数据交互方式来提高应用程序开发效率 而传统关系数据库最大的问题,应该就是阻抗失谐 第二,NoSQL数据库的共同特性是什么? 不使用关系模型:在集群中运行良好:开源:适用于21世纪的互联网公司:无模式 第三,NoSQL数据模型: 模型主要可以分为四类:‘键值’ ‘文档’ ‘列族’ ‘图’ 前三