这篇文章简要介绍了Windows communication Foundation (WCF),以及如何在应用程序中调用WCF 服务,非常适合WCF 的初学者。 --- CodeProject.com WCF 开发向导经典推荐!!!
http://forum.EntLib.com 开源ASP.NET 论坛小组奉献。
WCF
简介
Windows Communication Foundation (WCF) 是.NET Framework 的扩展,用来创建互连的系统。WCF 提供了创建安全的、可靠的、事务服务的统一框架,WCF 整合和扩展了现有分布式系统的开发技术,如Microsoft .Net Remoting、Web Services、Web Services Enhancements (WSE)等等,来开发统一的可靠系统。WCF 框架可以实现SOA架构的松散耦合的应用程序,
WCF 简化了构建SOA架构应用的工作,同时通过统一Enterprise Services、Messaging、.Net Remoting、Web Services、WSE 等技术,降低开发复杂度。WCF服务可以通过属性Attribute进行配置,提高灵活性和效率,支持大量的Web Services标准,如XML、XSD、SOAP、Xpath、WSDL等标准和规范,如WS-Addressing、WS-Policy、WS-Security、WS-Trust、WS-Secure、WS-Reliable Messaging、WS-Atomic Transaction、WS-Coordination等等。下图描绘了Windows communication Foundation (WCF) 框架模型:
WCF
通信模型
WCF 遵从客户/服务端模型在应用程序间建立通信,客户端程序通过服务端公布的Endpoints端点来直接访问服务。Endpoints 是发送或接收消息的一个地址,每一个服务WCF Service可以有多个Endpoints。
WCF 服务由如下几个主要组件组成,下图表示了这些组件如何进行交互:
- Service Contract
- Operation Contract
- Data Contract
- Data Member
Service Contract
Service Contract 定义了会话中的消息方向和类型,用一个接口或类订阅WCF的Service Contract。Service Contract 是外部应用程序访问服务方法的一个通道,在一个服务中至少应该有一个ServiceContract。ServiceContract的定义如下:
[ServiceContract]
public interface IWCFForumService
{
[OperationContract]
string GetMessage(int messageID);
[OperationContract]
IEnumerable GetMessageInfo(int messageID);
}
http://forum.EntLib.com 开源ASP.NET论坛小组备注:这里的示例代码采用开源论坛EntLib_BBS数据库,你可以很方便地改用其他数据库。
上述接口的ServiceContract attribute 表明这是一个Service Contract,同时Service Contract定义了服务中可用的方法,WCF 服务中的方法与Web services 中的方法比较类似。IWCFForumService 是Forum 的Service接口,公布了服务中所有的OperationContract 方法给外部系统。
Operation Contract
Operation Contract 定义了WCF 服务中提供给外部系统访问的方法。OperationContract attribute 需要应用到这些方法上,就像Web services 中的Web method 一样。Operation Contract 的示例代码参考IWCFForumService 接口定义。
Data Contract
Data Contract 定义了一系列DataMember,作为一个组合类型(Composite type)在ServiceContract 中使用。通过应用DataContract attribute给一个类来定义Data Contract,Data Contract需要通过serializer 进行序列化。通过应用DataMember attribute 到成员变量上,DataMember 成员变量需要序列化。MessageInfo – Data Contract 的定义如下:
[DataContract]
public class MessageInfo
{
private int _messageID;
private DateTime _postedDate;
private string _message;
[DataContract]
public class MessageInfo
{
private int _messageID;
private DateTime _postedDate;
private string _message;
[DataMember]
public int MessageID
{
get { return _messageID; }
set { _messageID = value; }
}
public int MessageID
{
get { return _messageID; }
set { _messageID = value; }
}
[DataMember]
public DateTime PostedDate
{
get { return _postedDate; }
set { _postedDate = value; }
}
public DateTime PostedDate
{
get { return _postedDate; }
set { _postedDate = value; }
}
[DataMember]
public string Message
{
get { return _message; }
set { _message = value; }
}
}
public string Message
{
get { return _message; }
set { _message = value; }
}
}
Data Member
DataMember attribute 可以应用到私有成员变量(Private member)上,需要序列化和反序列化,可以访问存取。DataMember的用法参考上面MessageInfo 的定义。