zoukankan      html  css  js  c++  java
  • 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     } 
  • 相关阅读:
    Vue实现的mini计算器
    动态 WebApi 引擎使用教程(3行代码完成动态 WebApi 构建)
    [备忘] 解决 rzc discover exited with code -2147450730 问题
    一个由于侵入框架引起的故障
    计算机基础--01
    csharp: read xml
    Hystrix 原理深入分析-spring cloud 入门教程
    Hystrix 简介-spring cloud 入门教程
    linux下使用 du查看某个文件或目录占用磁盘空间的大小
    最火的Spring Cloud Gateway 为经过身份验证的用户启用速率限制实践-spring cloud 入门教程
  • 原文地址:https://www.cnblogs.com/prolove2/p/2469341.html
Copyright © 2011-2022 走看看