WCF笔记

-》WCF
 WCF合并了ASP.NET Web 服务、.NET Remoting、消息队列和Enterprise Servives的功能
 WCF本质提供一个跨进程、跨机器以及跨网络的服务调用
 WCF不能孤立存在,需要寄宿于一个运行着的进程中—宿主
 WCF的典型宿主包括一下四种:
  1."Self-Hosting" in a Managed Application(自托管宿主)
  2.Managed Windows Services(Windows Services宿主)
  3.Internet Information Service(IIS宿主)
  4.Windows Process Activation Service(WAS宿主)
 
 internal(访问修饰符):只有在同一个程序集的文件中,内部类型或成员才是可访问的,接口Interface不加修饰符默认是internal,内部成员为public
 
 WCF应用程序和WCF类库区别:
  类库只是类的集合,不能单独运行。
  WCF服务程序项目是可以直接托管执行的,svc文件属于WCF服务的特定文件扩展名,IIS里有对应的处理程序。
  WCF服务程序可以直接IIS里托管即可,WCF类库需要一个程序来引用并托管它
  
 
 WCF包含四中类型的契约:服务契约、数据契约、消息契约和错误契约
    创建WCF项目需要引用System.ServiceModel
 
   WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint),
   的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成即为:Endpoint=ABC
  
   SOA:面向服务构架,一种粗粒度、松耦合服务构架,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA可以看作是B/S
    模型、XML/Web Service技术之后的自然延伸
 
   WCF配置文件分为服务端配置与客户端配置。
 1.服务端配置:
 <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
   <system.serviceModel>
    <behaviors>
     <serviceBehaviors>
      <behavior name="metadataBehavior">
       <serviceMetadata httpGetEnabled="true" httpGetUrI="http://127.0.0.1:9999/calculatorservice/metadata" />
      </behavior>
     </serviceBehaviors>
    </behaviors>
    <services>
     <service behaviorConfiguration="metadataBehavior" name="Services.CalculatorService">
      <endpoint address="http://127.0.0.1:9999/calculatorservice" binding="wsHttpBinding" contract="Contracts.ICalculator" />
     </service>
    </services>
   </system.serviceModel>
  </configuration>
  1.1<services>配置节点
   <service>配置了一个服务,可以有多个<service>也就是可以有多个服务
   name属性配置了实现Service Contract的类型名
   behaviorConfiguration属性配置了与<behaviors>节点的内容有关
   <endpoint>配置节是<service>配置节的主体,包含三部分:address  、binding和contract
    binding配置是在<bindings>配置节中完成,因而在<endpoint>中配置bindingConfiguration属性,指向具体的binding配置
   例如:
   <services>
    <service name="BruceZhang.MyService" behaviorConfiguration="MyBehavior">
     <endpoint address="" binding="netTcpBinding" contractConfiguration="DuplexBinding" contract="BruceZhang.IHello" />
    </service>
   </services>
   
   定义多个endpoint,例如:
   <services>
    <service name="Microsoft.ServiceModel.Sqmples.CalulatorService" behaviorConfiguration="CalculatorServiceBehavior">
     <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" />
     <endpoint address="mex" binding="mexHttpBinding"  contract="Microsoft.ServiceModel.Samples.IMetadataExchange" />
    </service>
   </services>
    如果address值为空,那么endpoint的地址就是默认的基地址(Base Address)。例如ICalculator服务的地址就是http://localhost/servicemodelsamples/services.svc
    而IMetaExchange服务的地址则为http://localhost/servicemodelsamples/service.svc/mex。这里所谓的基地址可以在<service>中通过配置<host>类定义:
    <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
     <host>
      <baseAddress>
       <add baseAddress="http://localhost/ServiceModelSamples/service.svc" />
      </baseAddress>
     </host>
    </service>
  1.2<behaviors>配置节
   服务端定义一个Service Contract,binding和address信息是客户端必须知道的,否则无法调用该服务。
   behavior设置服务的运行时属性
   通过自定义behavior插入一些自定义类型
   例如:通过指定ServiceMetadataBehavior,可以使WCF服务对外公布Metadata,配置如下:
    <behaviors>
     <serviceBehaviors>
      <behavior>
       <serviceMetadata httpGetEnabled="true" httpGetUrI="" />
      </behavior>
     </serviceBehaviors>
    </behaviors>
   在WCF中,behavior被定义为Attribute,其中,System.ServiceModel.ServiceBehaviorAttribute和System.ServiceModel.OperationBehaviorAttribute
   是最常用的behavior。
   利用ServiceBehavior与OperationBehavior可以控制服务的如下属性:
   1.对象实例的生命周期
   2.并发与异步处理
   3.配置行为
   4.事务行为
   5.序列化行为
   6.元数据转换
   7.会话的生命周期
   8.地址过滤以及消息头的处理
   9.模拟(Impersonation)
   例如,通过ServcieBehavior设置对象实例的生命周期:
   <behaviors>
    <serviceBehaviors>
     <behavior>
      <instanceContectMode httpGetEnabled="true" httpGetUrI="" />
     </behavior>
    </serviceBehaviors>
   </behaviors>
   
 WCF常用binding方式:
  BasicHttpBinding:用于把WCF服务当做ASMX  Web 服务。用于兼容旧的Web ASMX服务。
  WSHttpBinding:比BasicHttpBinding更加安全,通常用于non-duplex服务通讯。
  WSDualHttpBinding:和WSHttpBinding相比,它支持duplex类型的服务
  WSFederationHttpBinding:WS-Federation安全通讯协议
  NetTcpBinding:使用TCP协议,用于在局域网内跨机器通信,有几个特点:可靠性、事务支持和安全,优化了WCF到WCF的通信。限制是服务端和客户端都必须使用WCF来实现
  NetNamedPipeBinding:使用命名管道进行安全、可靠、高效的单机服务通讯方式
  NetMsmqBinding:使用消息队列在不同机器见进行非连接通讯
  NetPeerTcpBinding:使用P2P协议在多机器间通讯
  MsmqIntegrationBinding:将WCF消息转化为MSMQ消息,使用现有的消息队列系统进行跨机器通讯。如:MSMQ
 
 通过IIS寄宿
  基本包含两个步骤:为WCF服务创建.svc文件和创建IIS虚拟目录
  1.为WCF服务创建.svc文件
   一个asp.net web 服务都具有一个.asmx文本文件,客户端通过访问.asmx文件实现对应Web 服务的调用。
   一个WCF服务也具有一个对应的文本文件,扩展名为.svc,基于IIS的服务的寄宿要求相应的WCF服务具有相应的.svc文件,.svc文件部署于IIS站点中,对WCF服务的调用体现在对.svc文件的访问上
   .svc文件仅仅包含一个ServiceHost指令(Directive),该指令具有一个必须的Service属性和一些可选的属性。
   svc仅仅具有一个包含Service属性(该属性指明了相应的WCF服务的有效类型)的ServiceHost指令。例如例子中的CalculatorService对应的.svc,如下所示
   把该.svc放在Services项目的根目录下,并将文件命名为CalculatorService.svc
   <%@ServiceHost Service="Services.CalculatorService" %>
  2.为WCF服务创建虚拟目录
   可以直接把Services项目的根目录映射为IIS虚拟目录,并把该虚拟目录的命名为WcfServices
   然后需要为通过IIS寄宿的CalculatorService创建配置文件,只需要在Services的根目录下创建一个Web.config,将WCF相应的配置文件添加到该配置文件即可。
   配置文件和自我寄宿配置一致,唯一不同的是在添加的终结点中无须指定地址,因为.svc所在的地址就是服务的地址。,也就是http://127.0.0.1:9999
   
->WCF 如何通过Remoting实现双向通信
 Remoting是NET平台下比较成熟的高效分布式技术。
    传统做法:远程调用的方式使用Remoting。在客户端所在的Application Domain,我们通过Proxy(Transparent Proxy)远程的跨Application Domain调用一个方法。
     当来自Client端的调用请求通过Proxy到达Server端所在的Application Domain后,Remoting Infrastructure在Server端激活(Activate)相应的远程对象(一个
     继承子System.MarvshalByRefobject类对象)——这里仅仅以服务端激活对象(Server Activated Object——SAO),然后再Server端执行相应的操作后把Result传递给Proxy,
     并最终到达Client。这是一种Request/Response的调用方式。
 .net平台下的Remoting是一种较web service更为成熟的分布式技术,提供了双向通信支持等web service不具备的功能
 双向通信实质上是采用的Duplex的MEX。也就是说,Server端在执行操作的时候,可以回调(Callback)Client端的操作(这个操作时在Client端的Application
 Domain中执行)
 
->在WCF中实现双工通信
 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息。基于双工MEP消息交换可以看作是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合。

原文地址:https://www.cnblogs.com/dongbo19910728/p/4305672.html