WCF 被关注的时间已经很长了,全名 "Windows Communication Foundation",它还有另外一个名字叫 Indigo,这应该是微软迈向 SOA 一个重要的标志。对开发者而言,一个统一的模型整合了以往零零碎碎的 WebService、Remoting、MSMQ 等技术,让分布式开发变得更加简单。
SOA 现在很热闹,但它早已经出现。最初厂商和网站炒 "WebServices" 的时候,SOA 就已经是个热门词汇了。但是在实际开发中,WebServices 和 .NET Remoting 的使用度并不高,原因太多太复杂。不过 WCF 的出现,相信会推进这一进程。
面向服务(SOA, service-oriented application)示意图
WCF 的架构模型和 .NET Remoting 有些类似,下图很好地说明了其执行的流程和相关结构。
WCF 架构示意图
WCF 宿主架构示意图
作为一种边界清晰、中立、高度独立的开发模型,WCF 几乎可用于所有的分布开发模式。
WCF 通讯方式示意图
(以上图片均选自《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)来描述服务策略。
除了上面这些,我们还会接触到 Behavior、Message 等信息。Behavior 用于对服务器进行一些设置,比如开放 WSDL 信息获取,反馈出错信息等。MessageContract 则可以自定义通讯消息,包括添加自定义的 Head。
和 Remoting 一样,我们可以选择不同的宿主,包括 IIS、WinForm、Windows Service、Console 等。推荐使用配置文件来完成服务器和客户端设置,但同样支持编码方式。WCF 客户端依然是一个代理对象,这个代理类型的代码一般由 Svcutil.exe 工具来生成。
SOA 现在很热闹,但它早已经出现。最初厂商和网站炒 "WebServices" 的时候,SOA 就已经是个热门词汇了。但是在实际开发中,WebServices 和 .NET Remoting 的使用度并不高,原因太多太复杂。不过 WCF 的出现,相信会推进这一进程。
面向服务(SOA, service-oriented application)示意图
WCF 的架构模型和 .NET Remoting 有些类似,下图很好地说明了其执行的流程和相关结构。
WCF 架构示意图
WCF 宿主架构示意图
作为一种边界清晰、中立、高度独立的开发模型,WCF 几乎可用于所有的分布开发模式。
WCF 通讯方式示意图
(以上图片均选自《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;
}
}
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 工具来生成。