WCF基础教程(三)——WCF通信过程及配置文件解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: WCF基础教程(三)——WCF通信过程及配置文件解析

引言


因为最近事情比较多对wcf的学习也被耽搁了一阵,今天总算是有一点时间,就把前一

段时间学习的内容在这总结一下,当然更重要一个的目的是和大家交流一下,这样才能

学习的更好。


一、WCF的优势


下面给大家展示一张我在学习过程见到的图片


20150813112717853.gif


二、WCF中的Endpoint(终结点)?


首先我们来看看终结点中包括那几个比较重要的部分,也就是我们常说

的“A”“B”“C”,它们分别代表什么?以及它们的作用是什么?


20150814104451640.gif


Address:一个要和服务端通讯的客户端要做的第一件事情,就是搞清数据要发给谁?目的地在哪?而Address 正是通过一个Uri 来唯一标示一个WCF 的终节EndPoint)的,它标示了消息发送的目的地。在WCF 数据通讯中,它解决了服务在哪里的问题,通过这个地址我们就可以找到我们要调用的WCF服务。A解决了:Where to locate the WCF Service?

 

Binding:英文理解为"捆绑,绑定", Binding实现在Client和Service通信的所有底层细节。如:我们在客户端与服务端传输的时候采用的是什么样的编码,XML?Text?二进制?...采用哪种传输协议进行传输,TCP?Http?以及采用什么样的机制解决安全问题,SSL?加密?...B解决了:How to communicate with service?

 

Contract:这个东西就是我们常说的契约,它的主要作用是暴漏某个wcf service所

提供的所有的有效方法,它实际上是把每个方法转化成为相对应的消息。  C解决了:What functionalities do the Service provide?


三、应用程序间的通信


首先让大家看一张比较官方的wcf架构图:

 20150814110044460.gif


上面的图实在是让我们着急啊,这是个什么东西啊?这么复杂,这就是我看到架构图的

第一反应,下面我给大家一种比较简单的解释:


20150814110332928.jpg

这样图片就比较简单了,简单来说,如果我们客户端和服务端想通信,那么我们的endpointA和endpointB必须完全符合,同样endpointE和endpointtD也是一样的,这因为应用程序之间是靠endpoint来通信的,所以说我们在客户端也必须定义终结点,只有客户端和服务端的终结点完全符合是才能进行通信。


四、WCF配置文件解读


首先来看一下我们在上一篇博客建立的wcf应用程序中的配置文件。


客户端


<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IUser" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:60193/User.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IUser" contract="ServiceReference.IUser"
        name="BasicHttpBinding_IUser" />
    </client>
  </system.serviceModel>
</configuration>


服务端

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。
        在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

有很多读者也许会感到奇怪,如果这个程序能正常运行的话,那么我们在前面讲的通信过程岂不是有错?因为我们只是在客户端中发现了endpoint,但是在服务端并没有发现,这是因为vs在生成配置文件的时候,将服务端的endpoint给隐藏了,当我们手动的给服务端添加上配置文件以后,程序会正常执行。


那么为什么没有终结点也会执行呢?答案是我们把WCF寄宿在IIS上,而IIS默认监听的就 是Http协议[B确定了]并且地址也是相对于IIS上的文件地址[A确定了],合同更不用说了,找到User.svc什么都有了[C确定了],所以在服务端就没有必要显示的写出system.serviceModel,不信你试试,把服务端的配置文件中system.serviceModel节删除,程序一样可以运行!服务器端的endpoint确定了,客户端的endpoint自然要和服务端去对应,所以IDE在生成客户端的配置文件里endpoint写的很详细的,而服务端却没有endpoint。


配种文件详解


20150814112510644.gif


小结


在项目中初次遇到这个东西的时候非常的痛苦,因为一旦有了错误根本不知道在拿下手来调试,当请教别人的时候发现错误原来这么简单,后来想了想是因为我们根本一点都不了解wcf的运行机制以及通信原理,所以在用了一段时间的wcf后决定学习它的原理,这样我们才能运用的更加灵活,也就是说当我们知道了“是什么”以后,还要知道“为什么”,这样的学习过程会让我们大大的提高学习效率,如果有什么理解不对的地方,还请各位读者留言指出!!

目录
相关文章
|
6天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
8 1
|
14天前
|
域名解析 网络协议
邮箱域名解析后收不到短信?三步修复教程
邮箱域名解析后收不到短信?三步修复教程
|
16天前
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
|
23天前
|
存储 安全 网络协议
Elasticsearch 配置文件解析
【10月更文挑战第3天】Elasticsearch 配置文件解析
56 3
|
23天前
|
弹性计算 负载均衡 网络协议
内部名称解析设置阿里云私有 DNS 区域,针对于阿里云国际版经验教程
内部名称解析设置阿里云私有 DNS 区域,针对于阿里云国际版经验教程
|
2月前
|
Rust Python
Python 解析 toml 配置文件
Python 解析 toml 配置文件
36 1
|
21天前
|
弹性计算 网络协议 数据库
在阿里云国际站上解析域名到服务器详细教程
在阿里云国际站上解析域名到服务器详细教程
|
2月前
|
Python
Python 解析 yaml 配置文件
Python 解析 yaml 配置文件
36 0
|
2月前
|
Python
Python 解析 ini 配置文件
Python 解析 ini 配置文件
31 0
|
3月前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
210 0

热门文章

最新文章

推荐镜像

更多