跟我一起从零开始学WCF系列课程(1):WCF概述

最近在学习MSDN广播站徐长龙老师的“跟我一起从零开始学WCF系列课程”,整理成学习笔记以供备忘和分享,新手入门请大家轻拍哦!


本章主要内容如下:

1.1 必备基础知识

1.2 什么是WCF?

1.2.1 场景介绍

1.2.2 常规.NET技术

1.2.3 What is WCF

1.2.4 WCF是对现有技术的统一

1.2.5 WCF的设计目标

1.2.6 DEMO:创建一个WCF服务

1.3 WCF背景介绍

1.3.1 ASP.NET

1.3.2 WSE

1.3.3 WCF

1.3.4 为什么会有WSE?

1.4 小结


1.1 必备基础知识:
• 熟悉Web Service编程
• 熟悉Visual Studio 2005/2008
• 熟悉分布式应用程序开发

1.2 什么是WCF

1.2.1 场景介绍

在了解什么是WCF前,我们先看一个场景,通过对此场景的分析,用常规.NET技术是实现需要用到哪些知识,然后引出WCF技术。
场景如下:

一家汽车租赁公司决定创建一个新的应用程序,用于汽车预定

该租车预定应用程序的创建者知道,应用程序所实现的业务逻辑必须能够让公司内外运行的其他软件访问,主要要求包括:
a 运行在Windows 桌面上的呼叫中心客户端应用程序;
b 基于J2EE 服务器构建、在非Windows 系统上运行的现有预定应用程序。由于最近与另一家汽车租赁公司合并,此现有系统必须能够访问新应用程序的逻辑,以便为合并后公司的客户提供一致的体验;
c 运行在各种平台上的合作伙伴应用程序,每个应用程序分别位于一个与该汽车租赁公司有业务合作的公司内。合作伙伴可能包括旅行社、航空公司,以及具有租车预定业务需求的其他组织。

假定该汽车预定程序是基于.NET FRAMEWORK的,a的呼叫中心在局域网内,也是.NET平台的,主要是对性能要求高一些;b的子公司应用程序是基于J2EE框架的,这样对互操作性、安全性和事务性要求高;c的合作伙伴应用程序是在互联网上,可能基于各种平台的,同样对操作性、安全性和事务性要求很高。图1.1可以清晰地反映出这种局域网跨平台、跨互网络多平台的情况。

WCF1.1

图1.1

1.2.2 常规.NET技术

基于上述场景,如果没有WCF,应用程序可能要使用多种现有的.NETFramework 技术,图1.2可以一目了然地看出来。

a 对于局域网内的呼叫中心,性能要求高, .NET远程处理 remoting技术 在性能和压缩方面都比较好
    – .NET Framework 远程处理。
    – 这种技术可用于与呼叫中心应用程序进行通信,因为二者都是建立在.NET Framework 之上的。远程处理专门为紧密耦合的.NET 到 .NET 通信而设计,因此它为本地网络中的应用程序提供了无缝而直接的开发体验。
    – 缺点:维护、调试困难

b 对于局域网内跨平台的子公司应用程序和跨互联网多平台的合作伙伴应用程序,互操作性、安全性、事务性要求高,分别采用以下技术:
1)实现互操作性--ASP.NET Web Service(ASMX)
    – ASP.NET Web 服务(ASMX)。
    – 这种技术用于与基于J2EE 的现有预定应用程序,以及与Internet上的合作伙伴应用程序进行通信。 因为目前大多数平台都支持基本的Web 服务,所以在WCF 发布之前,这是实现跨供应商互操作性的最直接的方法。

2)实现安全性采用WSE(Web Services Enhancements)--加强web service安全性的技术
    – 可与ASMX 一起使用,以便与基于J2EE 的预定应用程序以及合作伙伴应用程序进行通信。它实现了最新定义的一些Web 服务协议(统称WS-* 规范),因此只要相关所有应用程序都支持这些新规范的兼容版本,WSE 就可提供更加灵活的 Web 服务安全性。

3)事务性:企业服务(Enterprise Service)解决企业级网络间的事务处理,Microsoft消息队列(MSMQ)异步消息发送和接收的技术
    – 企业服务。
    – 租车预定应用程序使用该技术来管理对象生存期和定义分布式事务。在与此应用场景中的任何其他应用程序通信和集成时,这些功能会很有用,但是企业服务仅支持有限的一组通信选项。

    – Microsoft 消息队列(MSMQ)。
    – 用于与基于Windows 的合作伙伴应用程序进行通信,这些应用程序对数据传送、工作量分离以及应用程序生存期均要求有保证。消息队列提供持久稳定的消息传送,这通常是间歇式连接的应用程序的最佳解决方案。
4)缺点:维护、调试困难

WCF1.2

图1.2

由于建立在.NET Framework 之上,该汽车预定应用程序必须使用这些通信技术中的多种技术才能满足其要求。尽管这在技术上是可行的,但最终的应用程序实现起来将会很复杂,而且维护起来也很困难。

1.2.3 What is WCF?

WCF 就是针对这种繁杂却又切实存在的情况而设计的,是公开和访问服务的Windows应用程序的首选技术,基于分布式计算,面向服务的开发技术 windows communication foundation,一种全能型,高级版的web service,不仅是实现web servci企业服务,消息队列的安全性技术方案,这些技术都是企业级的应用。WCF 可使用Web 服务进行通信,因此与同样支持SOAP 的其他平台(例如基于J2EE 的主流应用程序服务器)间的互操作性就变得简单明了。

WCF1.3

图1.3

使用WCF,该解决方案的实现就容易得多了。如图1.3中所示,WCF可用于前述所有情况。因此,租车预定应用程序使用这一种技术就可以实现其所有应用程序间的通信。

• WCF 可使用Web 服务进行通信,因此与同样支持SOAP 的其他平台(例如基于J2EE 的主流应用程序服务器)间的互操作性就变得简单明了。
• 还可以对WCF 进行配置和扩展,以便与使用并非基于SOAP 的消息(例如像RSS 这种简单的XML 格式)的Web 服务进行通信。
• 性能是大多数业务中至关重要的考虑事项。开发WCF 的目标就是要使之成为Microsoft 所开发的速度最快的分布式应用程序平台之一。

• 当通信双方都建立在WCF 上时,为获得最理想的性能,本例中使用的线上编码是XML 信息集的一个优化的二进制版本。消息仍遵循SOAP 消息的数据结构,但其编码使用该数据结构的二进制表示形式,而不是XML 1.0 文本编码的标准尖括号加文本格式。使用此选项的意义体现在与呼叫中心客户端应用程序的通信中,因为该应用程序也是建立在WCF 上,并且性能是一个重要的考虑事项。
• 管理对象生存期、定义分布式事务以及企业服务的其他方面的功能现在可以由WCF 来提供。任何基于WCF 的应用程序都可以使用这些功能,这意味着租车预定应用程序可以针对与之通信的任何其他应用程序使用这些功能。
• WCF 支持一个大的WS-* 规范集,因此可在与同样支持这些规范的任何其他平台进行通信时帮助提供可靠性、安全性和事务。
• 建立在消息队列上的WCF 排队消息选项使应用程序能够使用持久的排队,而无需使用另外一组应用程序编程接口。

• 提供统一的,可用于建立安全、可靠的面向服务的应用的高效开发平台。
• 将Web 服务的概念直接映射到.NET Framework 公共语言运行库(CLR) 中的对应内容,包括将消息灵活且可扩展地映射到用诸如Visual C# 或Visual Basic 等语言实现的服务。该服务模型提供支持松散耦合和版本管理的序列化功能,并提供与诸如消息队列(MSMQ)、COM+、ASP.NET Web 服务、Web 服务增强(WSE) 等现有 .NETFramework 分布式系统技术以及很多其他功能的集成和互操作性。

1.2.4 WCF是对现有技术的统一

由图1.4可以看出,WCF统一System Messaging,  WSE,  .NET Remoting, ASMX 与Enterprise Services的开发模型,为各种应用提供单一的编程模型,基于配置驱动的协议选择,消息格式,进程分配等。

WCF1.4

图1.4

1.2.5 WCF设计目标
a 生产效率
    --统一了现有的各种分布式技术(System Messaging, WSE, Remoting, ASMX, Enterprise Service)
    --基于属性(Attribute)的开发(类和方法用属性去修饰,实现定义)
    --与Visual Studio.NET 2005的无缝集成,.NET 2008/2010 更无缝集成了
b 可交互性
    --广泛地支持WS-*系列通用规范
    --与现有的微软分布式技术相兼容,用.NET框架包装了一次现有的分布式技术
c 面向服务的开发
    --使得编写松散耦合的服务变得容易,跨应用程序,跨网络(面向对象的开发是紧密耦合)
    --服务的行为及属性(如通讯方式)可以通过配置来指定,配置文件web conig或application config,部署非常灵活

WCF1.5

图1.5

1.2.6 创建一个WCF服务

-全新的Web Service 界面,不再是.asmx文件,不是asp.net网站上web服务了
-属性化编程

代码
//接口类文件
//增加属性类[]修饰,服务的协定/合同,定义好WCF服务的名字
[ServiceContract] 
Public interface IHelloService
{
   //定义服务方法的名字
   [OperationContract] 
   string Hello();
}

//实现接口类文件
public class HelloService : IHelloService
{
   public string Hello ()
   {
       return “Hello”;
   }
}

这个方法不仅可以给内部网同样WCF的客户端程序调用,还可以配置为在IIS里集成的一个公开的web服务方法,给J2EE的应用程序或者internet上的任何合作伙伴应用程序调用。

demo:

开发环境:Visual Studio 2008 + NET Framework 3.5。

开发步骤:

a. 打开VS2008->New->Project->Visual C#->WCF->WCF Service Library, 创建WcfServiceLibrary1;

b. 打开接口文件IService1.cs:自动引用using System.ServiceModel;WCF服务封装在这里面(App.config很重要 里面配置一些服务地址host、endpoint、行为behavior等,有关配置、绑定之类的后续章节会讲到);

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfServiceLibrary1
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in App.config.    
    //ServiceContract为服务契约
    [ServiceContract]
    public interface IService1
    {
        //OperationContract为方法契约
        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

        // TODO: Add your service operations here
    }

    // Use a data contract as illustrated in the sample below to add composite types to service operations
    //DataContract修饰自定义类,便于soap序列化
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";
        //修饰自定义类的属性
        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
}

c.打开实现接口类文件Service.cs

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfServiceLibrary1
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in App.config.
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }
}

d. 调试:F5 -> WCF Test Clint (WCF Service Host) -> http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary1/Service1/mex ->IService1 (WSHttpBinding_IService1) ->双击GetDataUsingDataContract() -> GetDataUsingDataContract中选择True –> StringValue 输入”test by dqj”-> 点击“Invoke” -> Respose中BoolValue显示True,StringValue 显示"test by dqjSuffix"。

         由此可见,该服务主要实现一个GetData方法,用于提示用户输入的数字(如"You entered: 5"),实现另一个方法GetDataUsingDataContract,该方法根据自定义类型CompositeType的BoolValue属性,如果为True则在用户输入的字符串后面添加Suffix(如"test by dqjSuffix")

WCF1.6.1

图1.6

e. 刚才是直接调试WCF服务程序,我们也可以创建客户端程序来调用WCF服务。如在项目中添加客户端程序WindowsFormsApplication1,添加按钮(btnInvokeWCFService),按钮事件中添加如下代码:

代码
        private void btnInvokeWCFService_Click(object sender, EventArgs e)
        {
            ServiceReference1.Service1Client data = new WindowsFormsApplication1.ServiceReference1.Service1Client();
            //MessageBox.Show(data.GetData(5));

            ServiceReference1.CompositeType myType = new WindowsFormsApplication1.ServiceReference1.CompositeType();
            myType.BoolValue = true;
            myType.StringValue = "hello";

            //ServiceReference1.Service1Client myClient = new WindowsFormsApplication1.ServiceReference1.Service1Client();
            //MessageBox.Show(myClient.GetDataUsingDataContract(myType).StringValue);
            ServiceReference1.CompositeType returnType = new WindowsFormsApplication1.ServiceReference1.CompositeType();
            returnType = data.GetDataUsingDataContract(myType);
            MessageBox.Show(returnType.StringValue);
        }

f. 设置WindowsFormsApplication1为启动项,F5 -> 点击按钮“Invoke WCF Service” -> 弹出"You entered: 5" -> 点击确定 -> 弹出"helloSuffix"

WCF1.7

图1.7

1.3 WCF背景介绍
阶梯式发展:ASP.NET -> WSE -> WCF  安全性越高,功能越强大

WCF1.8

图1.8

1.3.1 ASP.NET网络服务(结构由下往上,[]内代表不能实现的内容):
- 传输层:HTTP [TCP Custom(自定义传输协议) …]
- 网络基础:
    [Security Reliability Transactions]
      Metadata
    Messaging
    XML
- 应用软件层: Connected Applications  (Management  Business Process …)

WCF1.9

图1.9


1.3.2 WSE(结构由下往上,[]内代表不能实现的内容,()代表包含关系):
- 传输层:HTTP TCP Custom …
- 网络基础:
    Security [Reliability Transactions]
      Metadata
    Messaging
    XML
- 应用软件层:Connected Applications  (Management  Business Process …)

WCF1.10

图1.10

 

1.3.3 WCF(结构由下往上,[]内代表不能实现的内容):
- 传输层:HTTP TCP Custom …
- 网络基础:
    Security Reliability Transactions
      Metadata
    Messaging
    XML
- 应用软件层: Connected Applications  (Management  Business Process …)

WCF1.11

图1.11

1.3.4 为什么会有WSE?
– 基本的ASPNET 无法满足工业界对网络安全越来越多的需求
– WCF 又需要有较长的时间来完成,到06年底才正式发行
– WS-* 通信协议也需要有一个微软产品来支持
– WSE 就这样诞生了

WSE1.0 2003年2月
WSE2.0 2004年7月
WSE3.0 2005年11月
WCF    2006年底

1.4 小结

• 什么是WCF?
• WCF背景介绍

点击下载DEMO:WcfServiceLibrary1

 

作者:不具名的空间
出处:http:
//www.cnblogs.com/dqj1024/
版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2012-07-21 15:04  danjon  阅读(2341)  评论(9编辑  收藏  举报
作者:不具名的空间
出处:http:
//www.cnblogs.com/dqj1024/
版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。