zoukankan      html  css  js  c++  java
  • WCF研究前篇

    前篇
    1.从SOA说起
    2.什么是WCF
    3.WCF通信模型
    4.Endpoint与ABC以及元数据
     
     1.SOA (Service Oriented  Architecture)
    Ø 一种组件架构模型
    Ø 主要特点
    每个服务具有明确的服务边界。
    服务独立,低耦合。
    采用标准的契约定义和通信协议。
    服务是自解释的。
     
     2.WCF (Windows Communication  Foundation)
    Ø 是微软为SOA(Service-Oriented  Architecture)而设计的一套完整的技术框架
    Ø 通过WCF技术可以创建服务
    跨进程
    跨机器
    跨网络
    Ø WCF 提供了创建安全的、可靠的、事务服务、多种协议的统一框架
    Ø WCF 整合和扩展了现有分布式系统的开发技术,如Microsoft .Net Remoting、Web Services、Web Services Enhancements (WSE)等等。
     
    WCF 各种分布式技术统一江湖:(图解)
     
    实例:
    Ø 1 建立简单的WCF服务
     (直接新建一个WCF项目,基本都是默认的,未做任何修改)
     1  // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
     2     [ServiceContract]
     3     public interface IService1
     4     {
     5 
     6         [OperationContract]
     7         string GetData(int value);
     8 
     9         [OperationContract]
    10         CompositeType GetDataUsingDataContract(CompositeType composite);
    11 
    12         // TODO: 在此添加您的服务操作
    13     }
    14 
    15 
    16     // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
    17     [DataContract]
    18     public class CompositeType
    19     {
    20         bool boolValue = true;
    21         string stringValue = "Hello ";
    22 
    23         [DataMember]
    24         public bool BoolValue
    25         {
    26             get { return boolValue; }
    27             set { boolValue = value; }
    28         }
    29 
    30         [DataMember]
    31         public string StringValue
    32         {
    33             get { return stringValue; }
    34             set { stringValue = value; }
    35         }
    36     }
    新建简单WCF服务
     1  // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。
     2     // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。
     3     public class Service1 : IService1
     4     {
     5         public string GetData(int value)
     6         {
     7             return string.Format("You entered: {0}", value);
     8         }
     9 
    10         public CompositeType GetDataUsingDataContract(CompositeType composite)
    11         {
    12             if (composite == null)
    13             {
    14                 throw new ArgumentNullException("composite");
    15             }
    16             if (composite.BoolValue)
    17             {
    18                 composite.StringValue += "Suffix";
    19             }
    20             return composite;
    21         }
    22     }
    实现接口
    Ø 2 建立客户端调用WCF服务
    (先添加服务引用)
     
     1             wcfFirst.Service1Client sc = new wcfFirst.Service1Client();
     2 
     3             string inputStr = Console.ReadLine();
     4             string outputStr = sc.GetData(int.Parse(inputStr));
     5             Console.WriteLine("WCF返回信息:" + outputStr);
     6 
     7 
     8             wcfFirst.CompositeType ct = new wcfFirst.CompositeType();
     9             ct.StringValue = 1;
    10             ct.BoolValue = true;
    11             wcfFirst.CompositeType newCt = sc.GetDataUsingDataContract(ct);
    12             Console.WriteLine("newCt.StringValue:" + newCt.StringValue);
    简单WCF客户端调用

    Ø 3建立复杂的WCF项目

    WCF服务库  是以独立于主机的 DLL 动态库项目;
     
    新建的WCF项目复杂的与简单的配置文件是有区别的:
     
     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <configuration>
     3 
     4   <appSettings>
     5     <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
     6   </appSettings>
     7   <system.web>
     8     <compilation debug="true" />
     9   </system.web>
    10   <!-- 部署服务库项目时,必须将配置文件的内容添加到 
    11   主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
    12   <system.serviceModel>
    13     <services>
    14       <service name="WcfServiceLibrary1.Service1">
    15         <host>
    16           <baseAddresses>
    17             <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
    18           </baseAddresses>
    19         </host>
    20         <!-- Service Endpoints -->
    21         <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
    22         <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1">
    23           <!-- 
    24               部署时,应删除或替换下列标识元素,以反映
    25              用来运行所部署服务的标识。删除之后,WCF 将
    26               自动推断相应标识。
    27           -->
    28           <identity>
    29             <dns value="localhost"/>
    30           </identity>
    31         </endpoint>
    32         <!-- Metadata Endpoints -->
    33         <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 --> 
    34         <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
    35         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    36       </service>
    37     </services>
    38     <behaviors>
    39       <serviceBehaviors>
    40         <behavior>
    41           <!-- 为避免泄漏元数据信息,
    42           请在部署前将以下值设置为 false -->
    43           <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
    44           <!-- 要接收故障异常详细信息以进行调试,
    45           请将以下值设置为 true。在部署前设置为 false 
    46             以避免泄漏异常信息-->
    47           <serviceDebug includeExceptionDetailInFaults="False" />
    48         </behavior>
    49       </serviceBehaviors>
    50     </behaviors>
    51   </system.serviceModel>
    52 
    53 </configuration>
    复杂WCF服务库的配置文件

    注意:配置文件的内容修改一定要慎重,简单内容无所谓。有时候两个项目的配置文件看着明明一样可就是不能正常双工通信,直接复制文件过来是又可以正常使用。这个在后面双工那部分会详解。

     3.WCF通信模型
    客户端和服务端之间通信的方式
    服务与协定-Contract
    服务端可以提供什么服务?
    Ø 指定一个规则
    Ø Contract
    Ø 协定,契约,合同
    协定分类
    Ø Service Contract
    定义了服务的类型,用一个接口或类订阅WCF的Service Contract。
    Ø Operation Contract :
    定义了WCF 服务中提供给外部系统访问的方法。
    Ø Data Contract :
    自定义的复杂数据类型
    Ø Message Contract
    用于控制SOAP消息的规则
    Ø Fault Contract
    用于捕获服务端错误消息
    WCF 服务4个最主要组件及其关系
    Ø Service Contract
    Ø Operation Contract
    Ø Data Contract
    Ø Data Member
    4.WCF中的基本感念-Endpoint与ABC 
    WCF中的基本感念-ABC
     ABC
    Ø A:Address
    where -服务在哪里
    Address地址的作用
    Ø 通过一个URI Endpoint告诉潜在的WCF service的调用者如何找到这个WCF Service。
    表现形式
    Ø HTTP协议:http://<server>:<port>/<service>

                              https://<server>:<port>/<service>

    Ø TCP协议:net.tcp:// <server>:<port>/<service>
    Ø 管道:net.pipe:// <server>/<service>
    Ø MQ:net.msmq:// <server>/public(private)/<service>
    Ø B:Binding
     how  -通过什么协议取得服务
    Binding的作用
    Ø 指明通过什么方式(协议)连接WCF 服务。
    常用协议
    Binding协议   传输协议 描述
    basicHttpBinding

    http

    https

    最简单的绑定类型,通常用于 Web Services。使用 HTTP 协议,Text/XML 编码方式。

    wsHttpBinding

    http

    https

    HTTP绑定的一种高级形式,比 BasicHttpBinding 更加安全,可以使用WSE中引入的所有额外功能,通常用于 non-duplex 服务通讯。

     wsDualHttpBinding  

    http

     

    扩展了WSHttpBinding功能,包含双向通信功能。

     netTcpBinding  TCP  

    用于TCP通信,允许配置安全性、事务处理等,效率高

     netNamedPipeBinding  IPC  

    在wcf应用程序中最适合本机进行安全通讯的binding,安全、可靠、高效

     netMsmqBinding  MSMQ  

    用于消息队列通信,支持排队

     Binding协议的选择

     
    Ø C:Contract
    what -定义的服务是什么
     WCF中的基本感念-Endpoint
      Endpoint 终节点
    Ø 建立相互关联中的各个Application的通信通道。
    Ø 用来发送或接收消息(或同时执行这两种操作)的入口。
      特殊的Endpoint -Mex节点
    Ø 用来做发现服务的特殊节点
    WCF通信模型
    客户端和服务端之间通信的方式
     
     
    ==================================================================================================================================================================== 技术跟新换代步伐太快,基础还是不会变的。打好基础,坚实自己的步伐,任何技术来了学习都会很快的。 大家共同学习,共同成长。 我QQ 624859714
  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/cyr2012/p/4249751.html
Copyright © 2011-2022 走看看