美文网首页程序员进阶之路
进阶之路—WCF的布置以及调用控制台篇

进阶之路—WCF的布置以及调用控制台篇

作者: 李九lijiu | 来源:发表于2017-09-12 12:59 被阅读34次

    上一篇文章,我讲解了 WCF 服务布置在 IIS 上面并被简单实用的例子,这一篇文章,我就来说一说 WCF 的强大之处—多宿主制。

    在说 WCF 之前,我们下来聊一聊当下项目中使用较多的 SOA 方式都有什么,并讨论一下他们的优缺点。

    Web Service:可以说是比较古老的方式,但是即使在当下这个技术层出不穷的时代,仍然保留着一席之地,这说明 Web Service 还是有一定的可取之处的,其缺点固然很直接,那就是 Web Service 走的 Soap 协议,其生成的文件十分庞大,举图说明:

    很好理解吧

    这也是Web Service令人发指的地方,特别是在当前移动互联火爆的年代,生成一个 Soap 格式的文件需要的流量要多很多,所以这也是其逐渐走向没落的主要原因,但是我们不能否认他的优点,那就是学习成本低,简单易用,上手快,这对一些小型公司来讲无疑是具有致命的吸引力的。

    WCF:这种技术是在 .net 3.0 时代出现的,可以说是标志性的,其功能强大,不仅可以支持多种协议( http、tcp... ),还可以托管在多种应用程序上,而且相对来说更安全,对用户权限验证方面的功能做的更好,但是,功能越强大,学习成本越高,很多人不怎么喜欢 WCF 这种技术,因为它的配置文件会让很多程序样抓狂(我也是这样)。但是不得不说 WCF 的功能是真的强大。

    WebAPI:简单的来讲,WebAPI 这项技术是现如今比较火爆的了,优点就在于与手机端的交互,其生成的是 json 格式的文件,体积小,轻便(有人做过测试,同样的字符串用不同的格式返回所占的体积大小各不相同,最大的是 Soap 格式的,其次是 Xml ,最小的是二进制的,json 比二进制稍微大一点),这样会为手机端用户剩下不少流量。只支持 http 协议,发送的请求也是 http 请求。也可以支持多宿主托管。

    从上面的分析我们不难看出,在功能方面来讲 WCF 可以说是最强大的,但是学习周期和成本来说比较高,所以很多公司对其嗤之以鼻,但是还是不能妨碍其功能强大的特点。接下来我们就来讲一下 WCF 是如何在控制台程序上面发布服务并被调用的。

    还是之前的那个程序:接下来我导入一些别人写好的例子(原谅我是个懒比,这例子代码太多了,还有配置文件,我本来也是想手写的,但是很累,所以真的不怪那么多人不喜欢 WCF 配置文件是真的烦)

    导入的类库以及控制台程序

    看结构目录很好理解, Hosting 是控制台程序, Interface 是接口文件 ,Model 是一个模型, Service 里边封装了一些远程调用的方法即 IIS 篇中的 .svc 文件。接下来我们来看一看难点:

    难点

    上图是我们配置之后的固定格式,说实话,这些代码是什么意思真的不好理解,看的我是云里雾里的,,但既然是固定写法,,我们暂时先不去深究,喜欢研究的同学可以私下研究研究。既然称之为难点,对于新手来讲,即使是固定写法,在你不了解的情况下,想要写出来也是很难的,所以我们可以使用另一种方法:

    WCF服务配置编辑器

    可以使用这种可视化界面来编辑 WCF 的配置文件,然后自动填充到配置文件中去

    自动填充的配置文件

    之后,后台代码就会变成:

    简化之后的代码

    是不是有一种拨开云雾见青天的爽快感。从上图的代码中我们可以发现,实际之前的一大堆代码最后就是简化成了两句代码,也就是说之前的那一堆代码很多都是可以写到配置文件里边的,这样学习起来也不算特别困难。

    我们可以试一下,以管理员的身份运行程序,这一点是必须要记住的,建议各位在打开 vs2017 的时候就以管理员的身份运行,这样也方便一些。

    控制台输出界面

    接下来我们用另一个测试类调用一下,看看是否能成功调用到部署在控制台程序上边的服务。

    成功找到部署在控制台的服务

    需要注意的是想要找到部署在控制台的服务跟找到部署在 IIS 的服务是一样的,需要打开部署的程序的,也就是让控制台程序运行,不然会出现主机连接不积极的报错。至于地址就是在配置文件里边的 address 节点。

    引用之后就很简单了,跟部署在 IIS 的操作基本都是一样的,

    远程调用一个方法

    从上图中我们看到,远程调用方法已经可以使用了,从结果上来讲我们已经成功了,但是我们观看一下被调用的代码发现了另一个问题

    被远程调用的方法

    在这个方法所生成的实体中我们看到是有 Id=13 这一条的,但是我们在远程获取到的结果中却没有看到 Id 这一属性,这就要说到我们在 Model 中定义属性的时候所添加的另一个特性契约了。

    Model中的实体类

    我们发现,Id属性的 [ DataMember ] 特性被注释之后,就无法从远程获取到了这个属性,包括我之前说过的 [ OperationContract ]特性,前者是某属性如果不被标识[ DataMember ]特性就不会被远程获取,后者是某方法如果不被标识[ OperationContract ]特性就不会被远程获取,这样大大的提高了安全性。

    以上就是 WCF 部署在控制台上的简单调用,,

    相关文章

      网友评论

        本文标题:进阶之路—WCF的布置以及调用控制台篇

        本文链接:https://www.haomeiwen.com/subject/akccsxtx.html