找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2443|回复: 0
收起左侧

反编译看核心的收获小记

[复制链接]
ID:113276 发表于 2016-4-10 20:01 | 显示全部楼层 |阅读模式
     序:
        来北京二十多天了,陆陆续续也在新公司上班半个月了。刚来公司没有立刻进入项目组开发,而是先熟悉环境、熟悉项目结构。在原来的工作里没有接触过WCF。却通过HR、前辈们口中多次听说过。由于原来的工作比较忙或者说自己比较懒,也没有去了解学习过他。仅仅知道有这么个东西,知道他基本的作用。公司花钱请你来是为了干活的吗、所以从TFS上Down下来xx系统源码,熟悉一下。以方便日后更快的融入项目组。由于保密协议此篇中仅是思想上的总结不会设计到任何源码。主要记录下原来没有基础过的技术以及好的第三方插件。

    0x01 前台:不容置疑,MVC火的一塌糊涂。就我上家公司也从WebForm过度到了MVC。而新公司也比例外,“前台”也是经典的MVC。以及一些常用的JQuery框架,具体的没有太细致的看。而我主要关心的还是通信以及调用关系。

    0x02 后台:“后台” 不容置疑一位高手进行了设计(至少对于我来说这个人很厉害)。WCF可以不依附IIS存在,而把他封装到了Console Application中。一个黑色的控制台窗体不免会带来神秘的气息。查看Main方法仅有一个静态方法的调用,通过ILSpy进行反编译DLL文件。核心的东西都封装到了这里面。

    0x03 核心剖析: WCF服务启动后会通过企业级缓存“Enterprise Library”把一些不经常修改的数据常驻内存,优点:这样可以避免重复读取数据库,节约IO资源。缓存加载完成后系统会反射某一路径下的DLL文件(即WCF Library)。并对ServiceHost进行继承封装。这样可以批量启动某路径下的WCF服务。
        
        此框架设计了单点登录。虽然我原来所设计的系统并没有此功能,但是自己也查过如何实现。有一天在休息的时候突然想到可以在数据库中预留一个GUID字段。当用户每次登录后就Create一个新的GUID值Update到相应的用户,然后用户携带Session值操作业务的时候都与相应的数据库GUID字段相比较,如果两值==则证明此用户为最新登录者,如果不等则把当前用户T掉系统并提示“该用户已在其他地点登录”。如此实现SSO未免有些牵强,因此方案仅能踢掉最先登录系统的用户并不能“准确”的告诉最新登录者当前帐号是否在线。

        当审计代码的时候,断点一步一步跟踪突然系统直接抛出异常“用户身份验证失败” 。说明SSO生效了。可是看“前台”代码仅仅一行调用WCF的操作,而我WCF初也加了断点并且调试没有进入直接抛出异常。想了很久没有看明白是怎么会是。甚至开始怀疑这是自己没有接触过的新语法糖。。。通过不停调试实验发现SSO的实现是写在了WCF中而非前台的Session中,为什么这么说那?因为当我把WCF关闭后他抛出的异常就会变成“监听端口不存在”之类的错误。所以断定是WCF进行的SSO。但是又没有进入对应断点的方法,很是纠结。。。后来想了想MVC有拦截器那WCF会不会也有拦截器。查询后发现继承IOperationBehavior, IParameterInspector接口后便可以进行拦截了。然“前台”调用WCF的时候第一个参数都是一个GUID,所以猜测应该是核心文件把WCF请求拦截后在内存中对比第一个GUID值查看是否存在,则进行相应的提示。

        一个很厉害的封装被我这平庸的语文水准一描述也变的暗淡无光了。。。好尴尬。。。

    尾:
        虽然没有对核心文件生成一张完整的结构图但也有了一个初步的认识。至少会对日后开发中遇到的稀奇古怪的错误有一定的帮助。日后还是需要像前辈看起,一个人技术的瓶颈完全在于你的观念。像我现在这样的猴子仅仅是代码中的搬运工,而此类高手写的代码那才是《指尖上的艺术》。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表