辉太 发表于 2012-12-18 18:53:53

WCF之略窥门径

WCF之略窥门径

<div class="postbody"><div id="cnblogs_post_body">WCF是什么东东?
   WCF,是.NET Framework 3.0中的四个组件之一,是微软专门针对面向服务(Service Oriented)应用程序提供的一个分布式编程框架,可以使用托管代码建立和运行SOA的软件系统。它使得开发者能够建立一个跨平台的、安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,例如.Net Remoting、ASMX、WSE和MSMQ,并且从分整合了.Net Remoting/Asp.Net/Xml/Web Service/MSMQ/WSE/Enterprise Service等多项分布式技术,取其精华,弃其糟粑 。以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML,Kerberos,X509,用户/密码,自定义等多种标准与模式。全称"Windows Communication Foundation".
整个WCF的架构结构图下图所示(图片来源http://dev.yesky.com/402/8079902.shtml)
http://pic002.cnblogs.com/images/2012/311888/2012050723075383.jpg          http://pic002.cnblogs.com/images/2012/311888/2012050821203820.jpg
WCF整个架构层次简单的说明:
      Contracts(契约):契约定义了整个消息系统的各个方面。而WCF契约有分好多种,数据契约描述了服务传递的每个消息的具体参数;消息契约使用SOAP来定义消息的具体格式;服务契约定义服务接口的方法签名;而策略和绑定规定访问服务的通信条件。(这些具体的契约我们后续一起慢慢完善它,先了解了解哈!大牛Artech等博客上都有详细的描述哈)。
      Service Runtime(服务运行时):服务运行时包含了在对服务进行实际操作时才发生的一些行为,即是服务的运行时行为。WCF也分好几种,节流阀行为(Throttling Behavior),控制着有多少消息能被处理;错误行为(Error Behavior)设定服务出现内部错误时,控制哪些信息被传递到客户端;元数据行为(Metadata Behavior)控制着哪些元数据暴露给外部;实例行为(Instance Behavior)控制着能运行多少服务的实例;事务行为(Transaction Behavior)在出现错误时保证事务操作能回滚;调度行为(Dispatch Behavior)控制着消息如何被整个WCF基础结构进行处理;并发行为(Concurrency Behavior)控制在服务运行的并发处理;参数过滤器(Parameter Filtering)控制着参数的过滤条件。
   Messaging(消息):消息层实际上由一些通道(Channel)所组成。所谓通道,就是一个以特定方式处理消息的组件。一系列的通道串联起来就成为通道栈。通道分为两种类型,协议通道和传输通道。协议通道有:WS安全协议通道(WS-Security Channel)、WS消息可靠性协议通道(WS-Reliability Channel)。传输通道有:HTTP通道(HTTP Channel)、TCP通道(TCP Channel)、命名管道通道(NamedPipe Channel)和消息队列通道(MSMQ Channel)。另外还有些编码通道(Encoders Channel)和事务流通道(Transaction Flow Channel)作为辅助,有兴趣的朋友可以更深的了解了解。
    Hosting and Activation(宿主和激活):服务必须在一个执行程序中运行。服务一般托管在外部可执行程序里面,如IIS和Windows激活服务(Windows Activation Service,WAS)。
以上是对WCF架构层次的简要说明,是不是感觉这个东西很强大啊!嘿嘿,那就写一个用WCF的小实例吧!
做一个订车票简单的简单小例子吧!首先来检查一下自己机器的环境,看是否满足开发WCF的需求(嘿嘿,瞎扯现在估计我们猿人的编程机器不想过去那么落后吧)!
开始,我们先做一个WCF的应用程序,如下图1。
http://pic002.cnblogs.com/images/2012/311888/2012050723290550.jpg图1.
当点击完成后,VS会为我们创建好如下图2的项目。
http://pic002.cnblogs.com/images/2012/311888/2012050723343917.jpg图2.
从图2可以一目了然的看到IService1.cs应该就是传说中的WCF的服务契约,当然上图是VS自动生成的一个结构。开始接才接触的人肯定奇怪怎么还有一个Service1.svc的文件,这个文件是干什么的么?
那就扯开话题来看看这个是怎么回事—>在archive博客上有这样的描述:在采用IIS/WAS进行服务寄宿的情况下,我们需要为寄宿的服务创建一个.svc文件。在通常的情况下(当然你也可以以内联的形式将整个服务类型也定义其中),我们仅仅在该.svc文件中定义基本的<%@ServiceHost%>指令信息。其中最重要的指令信息自然是通过Service属性指定的寄宿服务的类型(实际上调用ServiceHostFactory的CreateServieHost方法传入的第一个参数值)。进一步来说,如果服务端能够维护一个Service/ServiceHostFactory与请求地址之间的映射关系,我们就可以不再需要.svc文件,因为.svc对于服务激活来说就是起到了这么一个映射的作用。
嘿嘿,恍然大悟吧!这个Service1.svc在这里根据VS生成的代码是实现IService1.cs里的服务契约。转回话题,我们直接来继续写代码吧!
下面就是直接修改IService1.cs的服务契约:
<div class="cnblogs_code" >http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttp://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifView Code <div id="cnblogs_code_open_fac832d0-ea97-406e-86f7-d8f53739c0b1" class="cnblogs_code_hide">namespace HuiTaiWcf{    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.        public interface IService1    {            void Add_Ticket(int count);   //添加车票的方法            int Buy_Tickets(int Num);   //购买车票的方法            int GetdemandNum();         //查询车票的方法         // TODO: Add your service operations here    }    // Use a data contract as illustrated in the sample below to add composite types to service operations.        public class Ticket   {      bool T_Count = true;      //判断是否还有车票      int T_HowMany = 50;         //默认的车票            public bool BoolTicket         {            get { return T_Count; }            set            {                if (HowMany > 0)                {                  T_Count = false;                }                else                {                  T_Count = true;                }            }      }            public int HowMany         {            get { return T_HowMany; }            set { T_HowMany = value; }      }    }}
页: [1]
查看完整版本: WCF之略窥门径