|
序:
來北京二十多天了,陸陸續(xù)續(xù)也在新公司上班半個(gè)月了。剛來公司沒有立刻進(jìn)入項(xiàng)目組開發(fā),而是先熟悉環(huán)境、熟悉項(xiàng)目結(jié)構(gòu)。在原來的工作里沒有接觸過WCF。卻通過HR、前輩們口中多次聽說過。由于原來的工作比較忙或者說自己比較懶,也沒有去了解學(xué)習(xí)過他。僅僅知道有這么個(gè)東西,知道他基本的作用。公司花錢請(qǐng)你來是為了干活的嗎、所以從TFS上Down下來xx系統(tǒng)源碼,熟悉一下。以方便日后更快的融入項(xiàng)目組。由于保密協(xié)議此篇中僅是思想上的總結(jié)不會(huì)設(shè)計(jì)到任何源碼。主要記錄下原來沒有基礎(chǔ)過的技術(shù)以及好的第三方插件。
0x01 前臺(tái):不容置疑,MVC火的一塌糊涂。就我上家公司也從WebForm過度到了MVC。而新公司也比例外,“前臺(tái)”也是經(jīng)典的MVC。以及一些常用的JQuery框架,具體的沒有太細(xì)致的看。而我主要關(guān)心的還是通信以及調(diào)用關(guān)系。
0x02 后臺(tái):“后臺(tái)” 不容置疑一位高手進(jìn)行了設(shè)計(jì)(至少對(duì)于我來說這個(gè)人很厲害)。WCF可以不依附IIS存在,而把他封裝到了Console Application中。一個(gè)黑色的控制臺(tái)窗體不免會(huì)帶來神秘的氣息。查看Main方法僅有一個(gè)靜態(tài)方法的調(diào)用,通過ILSpy進(jìn)行反編譯DLL文件。核心的東西都封裝到了這里面。
0x03 核心剖析: WCF服務(wù)啟動(dòng)后會(huì)通過企業(yè)級(jí)緩存“Enterprise Library”把一些不經(jīng)常修改的數(shù)據(jù)常駐內(nèi)存,優(yōu)點(diǎn):這樣可以避免重復(fù)讀取數(shù)據(jù)庫,節(jié)約IO資源。緩存加載完成后系統(tǒng)會(huì)反射某一路徑下的DLL文件(即WCF Library)。并對(duì)ServiceHost進(jìn)行繼承封裝。這樣可以批量啟動(dòng)某路徑下的WCF服務(wù)。
此框架設(shè)計(jì)了單點(diǎn)登錄。雖然我原來所設(shè)計(jì)的系統(tǒng)并沒有此功能,但是自己也查過如何實(shí)現(xiàn)。有一天在休息的時(shí)候突然想到可以在數(shù)據(jù)庫中預(yù)留一個(gè)GUID字段。當(dāng)用戶每次登錄后就Create一個(gè)新的GUID值Update到相應(yīng)的用戶,然后用戶攜帶Session值操作業(yè)務(wù)的時(shí)候都與相應(yīng)的數(shù)據(jù)庫GUID字段相比較,如果兩值==則證明此用戶為最新登錄者,如果不等則把當(dāng)前用戶T掉系統(tǒng)并提示“該用戶已在其他地點(diǎn)登錄”。如此實(shí)現(xiàn)SSO未免有些牽強(qiáng),因此方案僅能踢掉最先登錄系統(tǒng)的用戶并不能“準(zhǔn)確”的告訴最新登錄者當(dāng)前帳號(hào)是否在線。
當(dāng)審計(jì)代碼的時(shí)候,斷點(diǎn)一步一步跟蹤突然系統(tǒng)直接拋出異常“用戶身份驗(yàn)證失敗” 。說明SSO生效了?墒强础扒芭_(tái)”代碼僅僅一行調(diào)用WCF的操作,而我WCF初也加了斷點(diǎn)并且調(diào)試沒有進(jìn)入直接拋出異常。想了很久沒有看明白是怎么會(huì)是。甚至開始懷疑這是自己沒有接觸過的新語法糖。。。通過不停調(diào)試實(shí)驗(yàn)發(fā)現(xiàn)SSO的實(shí)現(xiàn)是寫在了WCF中而非前臺(tái)的Session中,為什么這么說那?因?yàn)楫?dāng)我把WCF關(guān)閉后他拋出的異常就會(huì)變成“監(jiān)聽端口不存在”之類的錯(cuò)誤。所以斷定是WCF進(jìn)行的SSO。但是又沒有進(jìn)入對(duì)應(yīng)斷點(diǎn)的方法,很是糾結(jié)。。。后來想了想MVC有攔截器那WCF會(huì)不會(huì)也有攔截器。查詢后發(fā)現(xiàn)繼承IOperationBehavior, IParameterInspector接口后便可以進(jìn)行攔截了。然“前臺(tái)”調(diào)用WCF的時(shí)候第一個(gè)參數(shù)都是一個(gè)GUID,所以猜測應(yīng)該是核心文件把WCF請(qǐng)求攔截后在內(nèi)存中對(duì)比第一個(gè)GUID值查看是否存在,則進(jìn)行相應(yīng)的提示。
一個(gè)很厲害的封裝被我這平庸的語文水準(zhǔn)一描述也變的暗淡無光了。。。好尷尬。。。
尾:
雖然沒有對(duì)核心文件生成一張完整的結(jié)構(gòu)圖但也有了一個(gè)初步的認(rèn)識(shí)。至少會(huì)對(duì)日后開發(fā)中遇到的稀奇古怪的錯(cuò)誤有一定的幫助。日后還是需要像前輩看起,一個(gè)人技術(shù)的瓶頸完全在于你的觀念。像我現(xiàn)在這樣的猴子僅僅是代碼中的搬運(yùn)工,而此類高手寫的代碼那才是《指尖上的藝術(shù)》。
|
|