• 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     } 
  • 相关阅读:
    机器学习 —— 概率图模型(学习:最大似然估计)
    机器学习 —— 概率图模型(学习:综述)
    机器学习 —— 概率图模型(推理:决策)
    机器学习 —— 概率图模型(推理:连续时间模型)
    我的c++学习(3)字符的输入输出
    法国人的浪漫精神从在于他们的灵魂之中(转)
    我的c++学习(2)比较两个数字大小
    我的c++学习(1)hello world!
    获取datable中某行某列的数据
    学习资源asp.net
  • 原文地址:https://www.cnblogs.com/prolove2/p/2469341.html
Copyright © 2020-2023  润新知