wcf基础1
2009-04-25 14:10
120 查看
在WCF中,最重要的概念自然是服务(Service)。书中对服务的定义为“服务是暴露在外的一组功能的集合”。虽然服务大部分是以契约接口的形式存在,而对于服务的定义通常也与“面向接口编程”的思想近似,但更重要的是我们必须理解服务的含义。传统的编程思想,在理解业务逻辑的时候,我们可以将业务逻辑封装为对象,该对象提供了与业务相关的功能;而WCF编程却更多的是考虑如何提供业务服务,以及服务的消费者——客户端。
因此,面向服务编程思想中,调用业务的角色发生了根本的变化。以酒店预订业务为例,如果是传统的面向对象编程,在编写业务用例时,调用酒店预订对象的角色为Customer,如图所示:
如果是WCF服务编程,首先就要考虑服务的提供者与消费者。同样对于酒店预订业务而言,服务的提供者会定义和发布酒店预订服务,而客户端则完成服务的调用,如图所示:
WCF最关键的是“允许客户端跨越执行边界与服务进行通信。在同一台机器中,客户端可以调用同一个应用程序域中的服务,也可以在同一进程中跨应用程序域调用,甚至跨进程调用。” 客户端还可以跨机器访问服务,甚至“跨越Intranet或Internet的边界与服务交互。”
与传统的分布式技术如DCOM和.NET Remoting不同,不管服务对象是本地的还是远程的,WCF都提供了完全一致的编程模型,也就是通过代理的方式完成。这样做的好处在于:“它使得开发者不会因为服务位置的改变影响客户端,同时还大大地简化了应用程序的编程模型”。
在WCF中,要访问WCF服务,必须知道服务的地址(Address)。书中简单介绍了几种服务地址:TCP地址、HTTP地址、IPC地址、MSMQ地址、对等网地址。在定义服务时,都需要指定基地址。基地址的格式为:
[传输协议]://[机器名或域名][:可选端口]
书中列出了几个常见的地址:
http://localhost:8001
http://localhost:8001/MyService
net.tcp://localhost:8002/MyService
net.pipe://localhost/MyPipe
net.msmq://localhost/private/MyService
net.msmq://localhost/MyService
其中,前两个地址为HTTP地址,第三个为TCP地址,第四个为IPC地址,使用了命名管道,最后两个为MSMQ地址。
在定义了基地址后,还可以为每个服务指定URI。此时,服务的地址为基地址加上指定的URI。
契约(Contract)。“WCF的所有服务均暴露为契约(Contract)。契约是与平台无关的,是描述服务功能的标准方式。” WCF定义了四种类型的契约:服务契约(Service Contract)、数据契约(Data Contract)、错误契约(Fault Contract)以及消息契约(Message Contract)。
定义服务契约的特性为ServiceContract,它既可以应用到接口上,也可以应用到服务类上。最佳实践则是将特性应用到接口上,如:
[ServiceContract]
interface IMyContract
{
[OperationContract]
string MyMethod(string text);
//Will not be part of the contract
string MyOtherMethod(string text);
}
要将服务类型的成员定义在服务契约中,必须将ServiceContract和OperationContract特性结合起来。定义服务契约时,应着眼于服务的提供,而不是业务的实现。特别是在服务契约的概念里,是否属于服务契约,与对象的访问限定没有必然的联系。例如在机票预订服务中包含了两个方法:Subscribe()与Settle()。对于业务对象而言,这两个方法无疑都需要暴露为公有方法。但对于服务定义而言,服务的消费者仅需要关心Subscribe()方法而已。此时,机票预订服务接口的定义就应该如下:
[ServiceContract]
public interface ISubscribeTicket
{
[OperationContract]
bool Subscribe(Customer customer);
void Settle(double money);
}
此时暴露在服务契约中的方法只有Subscribe()方法。
一个单独的类通过继承或实现多个应用了ServiceContract特性的接口,实现对多个契约的支持。
书中特别申明:“实现(服务)时必须避免使用有参构造函数,因为WCF只能使用默认的构造函数。”
服务的名字与命名空间可以通过ServiceContract特性的Name和Namespace属性来指定。如果未指定,则默认的命名空间为http://tempuri.org,默认的服务名为接口名(或服务类名,如果ServiceContract特性直接应用到类上)。
因此,面向服务编程思想中,调用业务的角色发生了根本的变化。以酒店预订业务为例,如果是传统的面向对象编程,在编写业务用例时,调用酒店预订对象的角色为Customer,如图所示:
如果是WCF服务编程,首先就要考虑服务的提供者与消费者。同样对于酒店预订业务而言,服务的提供者会定义和发布酒店预订服务,而客户端则完成服务的调用,如图所示:
WCF最关键的是“允许客户端跨越执行边界与服务进行通信。在同一台机器中,客户端可以调用同一个应用程序域中的服务,也可以在同一进程中跨应用程序域调用,甚至跨进程调用。” 客户端还可以跨机器访问服务,甚至“跨越Intranet或Internet的边界与服务交互。”
与传统的分布式技术如DCOM和.NET Remoting不同,不管服务对象是本地的还是远程的,WCF都提供了完全一致的编程模型,也就是通过代理的方式完成。这样做的好处在于:“它使得开发者不会因为服务位置的改变影响客户端,同时还大大地简化了应用程序的编程模型”。
在WCF中,要访问WCF服务,必须知道服务的地址(Address)。书中简单介绍了几种服务地址:TCP地址、HTTP地址、IPC地址、MSMQ地址、对等网地址。在定义服务时,都需要指定基地址。基地址的格式为:
[传输协议]://[机器名或域名][:可选端口]
书中列出了几个常见的地址:
http://localhost:8001
http://localhost:8001/MyService
net.tcp://localhost:8002/MyService
net.pipe://localhost/MyPipe
net.msmq://localhost/private/MyService
net.msmq://localhost/MyService
其中,前两个地址为HTTP地址,第三个为TCP地址,第四个为IPC地址,使用了命名管道,最后两个为MSMQ地址。
在定义了基地址后,还可以为每个服务指定URI。此时,服务的地址为基地址加上指定的URI。
契约(Contract)。“WCF的所有服务均暴露为契约(Contract)。契约是与平台无关的,是描述服务功能的标准方式。” WCF定义了四种类型的契约:服务契约(Service Contract)、数据契约(Data Contract)、错误契约(Fault Contract)以及消息契约(Message Contract)。
定义服务契约的特性为ServiceContract,它既可以应用到接口上,也可以应用到服务类上。最佳实践则是将特性应用到接口上,如:
[ServiceContract]
interface IMyContract
{
[OperationContract]
string MyMethod(string text);
//Will not be part of the contract
string MyOtherMethod(string text);
}
要将服务类型的成员定义在服务契约中,必须将ServiceContract和OperationContract特性结合起来。定义服务契约时,应着眼于服务的提供,而不是业务的实现。特别是在服务契约的概念里,是否属于服务契约,与对象的访问限定没有必然的联系。例如在机票预订服务中包含了两个方法:Subscribe()与Settle()。对于业务对象而言,这两个方法无疑都需要暴露为公有方法。但对于服务定义而言,服务的消费者仅需要关心Subscribe()方法而已。此时,机票预订服务接口的定义就应该如下:
[ServiceContract]
public interface ISubscribeTicket
{
[OperationContract]
bool Subscribe(Customer customer);
void Settle(double money);
}
此时暴露在服务契约中的方法只有Subscribe()方法。
一个单独的类通过继承或实现多个应用了ServiceContract特性的接口,实现对多个契约的支持。
书中特别申明:“实现(服务)时必须避免使用有参构造函数,因为WCF只能使用默认的构造函数。”
服务的名字与命名空间可以通过ServiceContract特性的Name和Namespace属性来指定。如果未指定,则默认的命名空间为http://tempuri.org,默认的服务名为接口名(或服务类名,如果ServiceContract特性直接应用到类上)。
相关文章推荐
- WCF 第一章 基础 暴露元数据交换节点
- WCF 第一章 基础 更多关于配置文件的内容
- WCF 第四章 绑定 使用基础Web Services
- 以WCF安全认证方式调用通用权限管理系统获取基础信息资料
- WCF REST 基础教程
- WCF-基础知识
- WCF分布式开发步步为赢(1):WCF分布式框架基础概念
- wcf基础知识之 查看soap消息 TcpTrace
- wcf基础知识之ListenUri和ListenUriMode实现 逻辑地址和物理地址的分离
- 学习05:WCF基础
- 在Silverlight+WCF中应用以角色为基础的安全模式(一)基础篇之角色为基础的安全模式简介
- Wcf 基础编程
- 一步一个脚印学习WCF系列之WCF基础术语—地址(Address)(四)
- Wcf通讯基础框架方案(二)——集中配置
- WCF基础(续 完成一个WCF服务客户端)
- WCF基础
- WCF基础:绑定(一)
- WCF 基础之契约(Contract)[转]
- WCF基础教程之开篇:创建、测试和调用WCF
- Wcf 基础教程 服务寄宿之 Windows 服务寄宿