博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

转载来的wcf学习笔记01

Posted on 2008-05-28 15:38  wuhang  阅读(155)  评论(0编辑  收藏  举报
WCF 被关注的时间已经很长了,全名 "Windows Communication Foundation",它还有另外一个名字叫 Indigo,这应该是微软迈向 SOA 一个重要的标志。对开发者而言,一个统一的模型整合了以往零零碎碎的 WebService、Remoting、MSMQ 等技术,让分布式开发变得更加简单。

SOA 现在很热闹,但它早已经出现。最初厂商和网站炒 "WebServices" 的时候,SOA 就已经是个热门词汇了。但是在实际开发中,WebServices 和 .NET Remoting 的使用度并不高,原因太多太复杂。不过 WCF 的出现,相信会推进这一进程。

面向服务(SOA, service-oriented application)示意图
uploads/200704/11_134231_soa.gif


WCF 的架构模型和 .NET Remoting 有些类似,下图很好地说明了其执行的流程和相关结构。

WCF 架构示意图
uploads/200704/11_133734_wcf_architecture.gif


WCF 宿主架构示意图
uploads/200704/11_133944_wcf_host_architecture.gif


作为一种边界清晰、中立、高度独立的开发模型,WCF 几乎可用于所有的分布开发模式。

WCF 通讯方式示意图
uploads/200704/11_134236_wcf_comm.gif

uploads/200704/11_134240_wcf_comm2.gif


(以上图片均选自《Programming WCF Services》)

几乎所有的 WCF 的开发文章里都会提到一个名为 "ABC" 的说法,分别是 Address、Binding 和 Contract。Address表示服务的地址。比如 "http://localhost:8080/myservice.svc";Binding表示绑定策略。可以为单个服务添加多个绑定,如内部采取 NetTcpBinding(Binary),外网则采取 WSHttpBinding(Text),当然一个 Binding 也可用于多个服务;Contract表示服务契约。在 SOA 中客户端和服务器之间并没有直接的对象继承和引用关系,双方通过一种约定的格式来传递消息(Message),这种约定就是契约。

在 实际开发中,我们往往会将 "ABC" 反过来进行。首先定义及实现契约,然后选择合适的绑定模式,最后定义服务的地址。在 WCF 中,服务对象不再需要从 MarshalByRefObject 继承,我们也无需再关心 SAO、CAO 之类的区别,其模式更类似于 ASP.NET WebService,同样也支持 Session。WCF 更多地使用声明式编程模式,通过大量的特性(Attribute)来描述服务策略。
[ServiceContract()]
public interface ICalculate
{
  [OperationContract]
  double Add(double a, double b);
}

public class CalculateService : ICalculate
{
  public double Add(double a, double b)
  {
    return a + b;
  }
}

除了上面这些,我们还会接触到 Behavior、Message 等信息。Behavior 用于对服务器进行一些设置,比如开放 WSDL 信息获取,反馈出错信息等。MessageContract 则可以自定义通讯消息,包括添加自定义的 Head。

和 Remoting 一样,我们可以选择不同的宿主,包括 IIS、WinForm、Windows Service、Console 等。推荐使用配置文件来完成服务器和客户端设置,但同样支持编码方式。WCF 客户端依然是一个代理对象,这个代理类型的代码一般由 Svcutil.exe 工具来生成。