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
  • 相关阅读:
    Zabbix客户端日志出现(Not all processes could be identified, 解决
    zabbix 本地编译安装
    redis 配置文件解释 以及集群部署
    Unix shell范例精解 课后题
    if __name__ == '__main__':用法
    爬取猫眼电影100榜单 代码
    CentOS编译安装软件过程中遇到zlib.h: No such file or directory
    Codeigniter添加Composer支持
    CodeIgniter composer.json安装第三类库操作
    使用composer命令加载vendor中的第三方类库 的方法
  • 原文地址:https://www.cnblogs.com/cyr2012/p/4249751.html
Copyright © 2011-2022 走看看