WCF学习笔记(1)面向服务

面向服务的开发有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。

地址: 描述了服务侦听清求消息的地址。

绑定: 描述了服务如何监听消息。

契约: 描述了服务将会接收的消息的格式。 

契约的定义,参考如下代码: 

 1        [ServiceContract()]      

 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     }   

契约的实现,参考如下代码:

 1     public class Calculator:ICalculator
 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    }

控制台宿主的实现,参考如下代码:

 1     class Program
 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     } 

控制台中访问服务,参与如下代码:

 1     class Program
 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(38);
12 
13             Console.WriteLine(result);
14 
15             Console.ReadLine();
16         }
17     } 
原文地址:https://www.cnblogs.com/prolove2/p/2469341.html