从零开始学WCF(1)WCF概述

什么是WCF?

在了解WCF前,我们先看一个场景:

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

该租车预定应用程序的创建者知道,应用程序锁实现的业务逻辑必须能够让公司内外运行的其他软件访问:

1. 运行在Windows桌面上的呼叫中心客户端应用程序

2. 基于J2EE服务器构建、在非Windows系统上运行的现有预定应用程序。由于最近与另一家汽车租赁公司合并,此现有系统必须能够访问新应用程序的逻辑,以便为合并后公司的客户提供一致的体验。

3. 运行在各种平台上的合伙伙伴应用程序,每个应用程序分别位于一个与该汽车租赁公司有业务合作的公司内。合作伙伴可能包括旅行社、航空公司,以及具有租车预订业务需求的其他组织。

如果没有WCF,应用程序可能要使用多种现有的.NET Framework技术

1. ASP.NET Web服务(ASMX)Web Service:

这种技术用于与基于J2EE的现有预定应用程序,以及与Internet上的合作伙伴应用程序进行通讯。因为目前大多数平台都支持基本的Web服务,所以在WCF发布之前,这是实现跨供应商互操作性的最直接的方法。

2. .NET Framework远程处理 (Remoting):

这种技术可用于与呼叫中心应用程序进行通信,因为二者都是建立在.NET Framework之上的。远程处理专门为紧密耦合的.NET到.NET通信而设计,因此它为本地网络中的应用程序提供了无缝而直接的开发体验。

3. 企业服务(Enterprise Service):

租车预定应用程序使用该技术来管理对象生存期和定义分布式事务。在此应用场景中的任何其他应用程序通信和集成时,这些功能会很有用,但是企业服务仅支持有限的一组通信选项。

4. WSE

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

5. Microsoft消息队列(MSMQ)

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

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

 WCF就是针对这种繁杂却又切实存在的情况而设计的,是公开和访问服务的Windows应用程序的首选技术。

 

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

WCF可使用Web服务进行通信,因此与同样支持SOAP的其他平台(例如基于J2EE的主流应用程序服务器)间的互操作性就变得简单明了。

还可以对WCF进行配置和扩展,以便于使用并非基于SOAP的消息(例如RSS这种简单的XML格式)的Web服务进行通信。

性能是大多数业务中至关重要的考虑事项。开发WCF的目标就是要是它成为Microsoft所开发的速度最快的分布式应用程序平台之一。

建立在消息队列上的WCF排队消息选项使应用程序能够使用持久的排队,而无需使用另外一组应用程序编程接口。

总结一下就是:WCF是对现有技术的统一

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

WCF的设计目标

生产效率:

1. 统一了现有的各种分布式技术。

2. 基于属性(Attribute)的开发。

3. 与VS开发工具的无缝集成。

可交互性:

1. 广泛地支持WS-*系列通用规范。

2. 与现有的微软分布式技术相兼容。

面向服务的开发:

1. 使得编写松散耦合的服务变得容易。

2. 服务的行为及属性(如通讯方式)可以通过配置来指定。

 

创建一个WCF服务的DEMO演示:

1. 新建一个“WCF Service Library”

2. 在所创建的项目中我们可以看到其实他是一个类库,最大的区别是在App.config里有很多的配置信息,这个配置文件很重要。

另外还有一个接口文件“IService1.cs”,它这里引用了“System.ServiceModel”这个就是WCF的程序集。

(1)属性标签[ServiceContract]用来修饰定义这个接口为WCF的协定。

(2)接口中的方法修饰为WCF就要使用[OperationContract]来修改这个WCF的方法。如果没有加这个属性来修饰,他就不是WCF方法,也就不能被外面看到和调用了。

(3)如果要在WCF中传递一个自定义的类型,就要使用[DataContract]来修饰,所以要把这个要传递的参数类型使用[DataContract]来修饰它,那么它里面的参数使用[DataMember]来修饰,这样才可以跨互联网来传递这个参数类型

    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1
    {
        [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]
    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; }
        }
    }


3. 我们进一步来看一下实现这个WCF接口类的实现类Service1.cs:

他也需要引用System.ServiceModel程序集,第一个方法GetData只是简单的返回一个字符串。

第二个WCF的实现,是传递一个自定义的参数类型CompositeType,然后再返回一个CompositeType的类型。

    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

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


4. 点击Debug进行调试的话,就会自动出来一个WCF的测试客户端,这个与普通的类库项目是不一样的。这样很方便进行测试WCF服务。

5. 我们为了测试也可以添加一个“Windows Form Application”窗体项目来测试一下WCF服务的使用。首先我们要引用之前我们所创建的WCF服务,如下图所示,点击Discover就会自动在该解决方案中找到WCF服务。

 

6. 通过引用WCF服务后,就会在客户端的程序中生成一系列的代理类,还回帮我们引用到相应的WCF类库命名空间。我们点击显示隐藏文件后,就可以看到:

这里面的“service.wsdl”是WCF服务发现文件。

“Reference.cs”文件这是WCF生成的代理类,这个类里把我们WCF的接口以及Channel等都生成一遍,最重要的是这里有一个Service1Client,也就是具体服务协定的客户端类。我们在客户端调用服务,都是使用客户端代理类实现。包括我们自定义的参数类型他也会自动生成。

7. 在客户端调用WCF的服务:

在窗体上面加一个按钮,在点击按钮的时候让他运行如下代码:

        private void button1_Click(object sender, EventArgs e)
        {
            ServiceReference1.Service1Client sc = new ServiceReference1.Service1Client();
            MessageBox.Show(sc.GetData(5));

            ServiceReference1.CompositeType ct = new ServiceReference1.CompositeType();
            ct.BoolValue = false;
            ct.StringValue = "Hello WCF ";

            ServiceReference1.CompositeType newct = new ServiceReference1.CompositeType();
            newct = sc.GetDataUsingDataContract(ct);

            MessageBox.Show(newct.StringValue);
        }


这里的ServiceClient类就是WCF服务的代理类,也就是在Reference.cs里生成的类,CompositeType类也是在代理类里实现出来的。

这里需要注意的是,要先生成以下WCF代理类的实例后,在调用代理类中的WCF服务方法,那么代理类就会联系到WCF进行调用后,把WCF服务的返回值返回给代理类的返回值。

8. 把客户端窗体程序设计为启动项目,运行测试的话就可以点击按钮,调用WCF服务了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值