1. 契约(Contract)
WCF 所有的服务都会公开为契约,是描述服务功能的方式。
2. 服务契约(Service Contract)
- 服务器月是客户端能够执行的服务操作
- 服务契约的定义采用属性定义法, 例如:
[ServiceContract(Name="ServiceContract", Namespace="http://www.monkeyfu.net/")]
,就像给属性直接赋值一样 - 服务契约只能定义在接口或者类上,从而被定义为 WCF 服务:
[ServiceContract]
interface IMyInterface
{
}
// 或者:
[Service Contract]
class MyClass
{
}
- 服务契约名称,为什么要为契约定义别名?
- 因为,客户端要调用服务,必须要用到元数据(Metadata),而元数据(Metadata)中用别名描述服务,能降低耦合度。如果都用 IMyContract 作为服务名称就冲突了。
- 举例如下:用Name属性
[ServiceContract(Name="MyServiceContractA")]
interface IMyContract
{
}
[ServiceContract(Name="MyServiceContractB")]
interface IMyContract
{
}
- 契约的命名空间
- 默认情况下契约的命名空间是
http://tempuri.org/
,但是可以为契约定义命名空间。对外提供服务的命名空间通常使用公司的 URL。 - 契约的命名空间和.NET编程的命名空间具有一样的目的,确定契约的类型范围,降低契约类型的冲突几率。
- 举例如下:用Namespace属性
- 默认情况下契约的命名空间是
[ServiceContract(Namespace="http://www.mycompany.com.cn/")]
interface IMyContract
{
}
3. 托管 (Hosting)与宿主进程(Host Process)
- WCF服务不能你创建好了就完了,得把它放置到一个地方,让大家来访问调用,就好比你要卖胡辣汤,得有个店面吧,不能摆到马路上吧,想喝胡辣汤的人,来到你的店面吃才行吧,所以WCF也要有个放置它的地方,我们叫作托管。
- 每个WCF服务必须托管在Windows进程中,该进程被称为宿主进程。
- 托管的三种方式:
- 宿主可以由IIS提供(IIS托管)
- 也可以由Windows Vista的Windows激活服务(Windows Activation Service,WAS)提供(WAS托管)
- 宿主也可以由开发者做成应用程序的一部分来提供(自托管)
4. 地址
基地址(BaseAddress)
基地址就是只包括传输协议和服务位置中的目标机器名以及通信端口,不包括可选的URL
基地址格式是:
[传输协议]://[目标机器名][:可选端口]
举例如下:
http(传输协议)://localhost(机器名):8001(通信端口)
net.tcp(传输协议)://localhost(机器名):8003(通信端口)
地址(Address)
WCF 的每一个服务都有且有唯一的一个地址,地址就是服务的位置,你要用这个服务得知道这个服务的位置吧,这是最起码的。
地址包括两部分:传输协议和服务位置组成,服务位置又包括目标机器名,通信端口,URL(一个任意的字符串,比如:具体服务的名称)
地址的格式是:
[基地址]/[可选的URL]
-
举例如下:
http(传输协议)://localhost(机器名):8001(通信端口)
解释:采用 http 协议访问 localhost 机器,在 8001 端口等待用户的调用http(传输协议)://localhost(机器名):8002(通信端口)/MyService(服务名称,也是可选的URL)
解释:采用 http 协议访问 localhost 机器,MyService 服务在 8002 端口处等待用户的调用net.tcp(传输协议)://localhost(机器名):8003(通信端口)/MyService(服务名称,也是可选的URL)
解释:采用 net.tcp 协议访问localhost机器,MyService 服务在 8003 端口处等待用户的调用
5. 绑定(Binding)
- 服务之间的通信是多种多样的,有很多种通信模式
- 消息通信模式有:同步请求/应答模式/异步的即发即弃消息等
传递消息的传输协议有:HTTP/TCP/P2P等
消息的编码格式有:纯文本编码格式/优化性能的二进制编码格式等
消息的安全保障等等 - 若要计算各种通信模式和交互方式的组合,就多了去了,如果组合不好,有的可能会互斥,客户端和服务合理的组合这些选项才能保障通信的正常和顺畅,这些是很复杂的。
- 为了简化这个选项,使他们易于管理,开发人员不必在这方面煞费苦心,所以 WCF 引入了绑定(Binding)技术,将这些通信选项组合在一起,一个绑定封装了:消息通信模式,传递消息的传输协议,消息的安全性等一系列相关选项的集合。并使他们保持一致,所以开发者主要去实现服务的业务逻辑代码就可以了,不必关心通信模式了。