c# WCF初学笔记(2)

基于上一篇,下面继续:

WCF应用程序的基本组成:

WCF服务程序集:可以认为是一个包含WCF服务以及契约定义的类库。不能直接运行,你可以在其他项目里引用,在宿主里启用托管这个库,考虑WCF服务设计的时候,服务类的定义为单独的库,可以为其它项目使用。提高代码的复用性。
这个*.dll包含了表示希望向外部用户公开的整体功能的类和接口
WCF服务宿主:这个软件模块是承载WCF服务程序集的实体。
可以是任何.net可执行程序,WCF可以设置使用任何类型的应用程序(Windows Forms、Windows服务、WP应用程序等)来公开。
注意:
WCF在运行时必寄宿在“宿主程序”之上,WCF本身不能够独自运行(每个WCF服务必须宿主在一个Windows进程中)
WCF客户端:通过中间代理访问服务功能的应用程序(发起对WCF服务调用的客户端)。

WCF中ABC:
宿主与客户端相互通信会遵循ABC。注意构建WCF应用程序的核心模块。具体而言就是地址(A,address)、绑定(B,binding)、和契约(C,contract)。

地址Address:
服务的地址,WCF的每一个服务都具有一个唯一的地址。
远程调用者如果不能定位到远程类型的话,就不能进行通信。
如何为WCF服务指定一个地址?
对于任何一种情况,WCF地址确切的格式会根据我们选择的绑定类型有所不同(基于HTTP、命名管道、TCP或者MSMQ)。从宏观上讲,WCF地址可以指定如下一些信息:
构架:传输协议(HTTP、TCP等)
机器名:机器的完全限定域名(本机:localhost、远程:IP地址或者域名)。
端口:在很多情况下是可选的。例如,HTTP绑定默认的端口是80。
路径:WCF服务路径
可以由如下模板表示:(端口值是可选的,很多绑定不会使用)
构架://<机器名>[:端口]/路径
如果基于HTTP的绑定(basicHttpBinding、wsHttpBinding、wsDualHttpBinding 或者wsFederationHttpBinding),地址:
http://localhost:8080/ChatService
如果是基于TCP的绑定(如NetTcpBinding 或 NetpeerTcpBinding),地址:
net.tcp://localhost:8080/ChatService
虽然一个WCF服务可能只会公开一个地址(基于一个绑定),但是可以配置为一个地址的集合(使用不同的绑定),可以通过在*.config文件中定义多个endpoint元素来实现。可以为相同的服务指定许多ABC.

WCF绑定:客户端服务器端的通信模式
远程的调用者通过使用绑定来获取对服务的访问。
WCF附带了许多绑定的选择,每一个都针对特定需要。
WCF绑定可以指定如下特性:
用于移动数据的传输层(HTTP、MSMQ、命名管道、TCP)。
用于传输的信道(单向、请求响应、双向)。
用于处理数据本身的编码机制(XML、二进制等)。
任何被支持的Web服务协议
注意:
在WCF预定义绑定类型中,WSDualHttpBinding和NetTcpBinding均提供了对双工通信的支持,但是两者在对双工通信的实现机制上却有本质的区别。WSDualHttpBinding是基于HTTP传输协议的;而HTTP协议本身是基于请求-回复的传输协议,基于HTTP的通道本质上都是单向的。WSDualHttpBinding实际上创建了两个通道,一个用于客户端向服务端的通信,而另一个则用于服务端到客户端的通信,从而间接地提供了双工通信的实现。而NetTcpBinding完全基于支持双工通信的TCP协议

1.基于HTTP的绑定

在这里插入图片描述
每一种WC绑定在代码中都可由System.ServiceModel这个命名空间中的一种类类型来表示。
附上微软官网链接:https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel?view=netframework-4.8
第二种就是可以在*.config配置文件中去配置xml属性
或者修改配置文件中endpoint元素节点的binding属性值

					WCF提供的HTTP相关的绑定
			绑定类                             				 绑定元素
		BasicHttpBinding                					 <basicHttpBinding>
		WSHttpBinding										 <wsHttpBinding>
		WSDualHttpBinding									 <wsDualHttpBinding>
		WSFederationHttpBinding   							 <wsFederationHttpBinding>

WSDualHttpBinding主要的优势是它允许调用者和发送方使用双向消息进行通信
如果从安全性的角度考虑的话,可以考虑WSFederationHttpBinding这个基于Web服务的协议。

2.基于TCP的绑定

如果所有的机器运行于Windows操作系统,我们就可以不使用Web服务绑定而使用TCP绑定获取一下性能优势,它保证了所有数据都以紧凑二进制格式而不是XML来编码。

	                           TCP相关的WCF绑定
	               绑定类                             				 绑定元素
				NetNamedPipeBinding					<netNamedPipeBinding>
				NetPeerTcpBinding					<netPeerTcpBinding>
				NetTcpBinding						<netTcpBinding>

NetTcpBinding 类使用TCP在客户端和WCF服务之间移动二进制数据。这会比Web服务协议拥有更好的性能,但是这只能是内部的Windows解决方案。好的一面是NetTcpBinding支持事务、可靠会话和安全通信。
和NetTcpBinding 相似,NetNamedPipeBinding支持事务、可靠会话和安全通信,但是不能跨机器调用。如果我们要以最快的方式在相同机器WCF应用程序之间(如跨应用程序域)推送数据。NetNamedPipeBinding是最佳的选择。
以本项目为例,在服务器端的App.config文件中配置创建ABC:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- 部署服务库项目时,必须将配置文件的内容添加到
 主机的 app.config 文件中。System.Configuration 不支持库的配置文件。 -->
  <system.serviceModel>
    <services>
      <service name="ChatServer.ChatService">
        <!--设置双工通道:wsDualHttpBinding 大小写敏感-->
        <endpoint address="" binding="wsDualHttpBinding" contract="ChatServer.IChatService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/ChatServer/ChatService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,
          请在部署前将以下值设置为 false -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <!-- 要接收故障异常详细信息以进行调试,
          请将以下值设置为 true。在部署前设置为 false 
          以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

配置的片段:

        <!--设置双工通道:wsDualHttpBinding 大小写敏感-->
        <endpoint address="" binding="wsDualHttpBinding" contract="ChatServer.IChatService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>

这里的address属性值为空,由于是在本机开发,默认为
是http://localhost:8080/ChatService

契约(Contract):服务能干哪些事
WCF的所有服务都会公开契约(Contract)。契约与平台无关,是描述服务功能标准方式。WCF定义了四种类型的契约。

服务契约(Service Contract)
服务契约描述了客户端能够执行的服务操作。
数据契约(Data Contract)
数据契约定义了与服务交互的数据类型。WCF为内建类型如int和string隐式地定义了契约;我们也可以非常便捷地将定制类型定义为数据契约。
错误契约(Fault Contract)
错误契约定义了服务跑出的错误,以及服务处理错误和传递错误到客户端的方式。
消息契约(Message Contract)
消息契约允许服务直接与消息交互。消息契约可以是类型化的,也可以是非类型化的。如果系统要求互操作性,或者遵循已有消息格式,那么消息契约会非常有用。

发布了86 篇原创文章 · 获赞 1 · 访问量 835

猜你喜欢

转载自blog.csdn.net/qq_34550459/article/details/104510465