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