序:
來北京二十多天了,陸陸續續也在新公司上班半個月了。剛來公司沒有立刻進入項目組開發,而是先熟悉環境、熟悉項目結構。在原來的工作里沒有接觸過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值查看是否存在,則進行相應的提示。
一個很厲害的封裝被我這平庸的語文水準一描述也變的暗淡無光了。。。好尷尬。。。
尾:
雖然沒有對核心文件生成一張完整的結構圖但也有了一個初步的認識。至少會對日后開發中遇到的稀奇古怪的錯誤有一定的幫助。日后還是需要像前輩看起,一個人技術的瓶頸完全在于你的觀念。像我現在這樣的猴子僅僅是代碼中的搬運工,而此類高手寫的代碼那才是《指尖上的藝術》。
|