面向服务的开发有4个原则:边界清晰; 服务自治; 契约共享; 基于策略的兼容性。
边界清晰:服务可以穿越边界发送消息给其他服务,即可以发送和接收消息,也能被发送和接收的消息形状定义服务的边界。这些边界能被良好的定义,清晰地表示,并且是唯一的服务功能访问点。
服务自治:服务自治是指服务可以控制生命周期,能控制可用性和另外服务的边界。
契约共享:契约是用来描述参与者之间的消息,他是服务公开的接口。
基于策略的兼容性:用于描述服务之间交互的底层环境。例如,一些服务需要初始发送者抈有一个有效的AD账号或者X509证书。
在一个WCF中,标准消息头块中可能被包含如下的信息:
1. 最终接收者。 wsa:To
2. 初始发送者。 wsa:From
3. 错误发送地址。wsa:FaultTo
4. 消息标识。 wsa:MessageID
5. 关联消息。wsa:RelatesTo
6. 应答消息的监听者。 wsa:ReplyTo
7. 指定的操作。 wsa:Action
更多的资料,可以参考W3C的WS-Addressing规范。网址:http://www.w3.org/TR/ws-addr-core/
每一个服务都需要具备三个最基本的组成部分:地址,绑定和契约。这三个部分,常常被称为WCF的ABC。
地址: 描述了服务侦听清求消息的地址。
绑定: 描述了服务如何监听消息。
契约: 描述了服务将会接收的消息的格式。
契约的定义,参考如下代码:
2 public interface ICalculator
3 {
4 [OperationContract()]
5 int Add(int x, int y);
6
7 [OperationContract()]
8 int Sub(int x, int y);
9
10 [OperationContract()]
11 int Mul(int x, int y);
12
13 [OperationContract()]
14 int Div(int x, int y);
15 }
契约的实现,参考如下代码:
2 {
3 public int Add(int x, int y)
4 {
5 return x + y;
6 }
7 public int Sub(int x, int y)
8 {
9 return x - y;
10 }
11 public int Mul(int x, int y)
12 {
13 return x * y;
14 }
15 public int Div(int x, int y)
16 {
17 return x / y;
18 }
19 }
控制台宿主的实现,参考如下代码:
2 {
3 static void Main(string[] args)
4 {
5 WSHttpBinding binding = new WSHttpBinding(SecurityMode.None);
6 binding.MessageEncoding = WSMessageEncoding.Text;
7
8 Uri addressURI = new Uri("http://localhost:8080/Calculator");
9
10 ServiceHost host = new ServiceHost(typeof(Calculator));
11 host.AddServiceEndpoint(typeof(ICalculator), binding, addressURI);
12 host.Opening += new EventHandler(host_Opening);
13 host.Opened += new EventHandler(host_Opened);
14
15 host.Open();
16
17 Console.ReadLine();
18
19 host.Close();
20 }
21 static void host_Opened(object sender, EventArgs e)
22 {
23 Console.WriteLine("Host is opened!");
24 }
25 static void host_Opening(object sender, EventArgs e)
26 {
27 Console.WriteLine("Host is opening!");
28 }
29 }
控制台中访问服务,参与如下代码:
2 {
3 static void Main(string[] args)
4 {
5 EndpointAddress address = new EndpointAddress(
6 new Uri("http://localhost:8080/Calculator"));
7
8 WSHttpBinding binding = new WSHttpBinding(SecurityMode.None);
9
10 ICalculator calc = ChannelFactory<ICalculator>.CreateChannel(binding, address);
11 int result = calc.Add(3, 8);
12
13 Console.WriteLine(result);
14
15 Console.ReadLine();
16 }
17 }