閱讀370 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[原創-總結]WCF技術剖析係列總結篇

近半年以來,一直忙於我的第一本WCF專著《WCF技術剖析》的寫作,一直無暇管理自己的Blog。到目前為止《WCF技術剖析(卷1)》的寫作暫告一段落,初步預計於下個月由武漢博文視點出版。在《WCF技術剖析》寫作期間,對WCF又有了新的感悟,為此以書名開始本人的第三個WCF係列。本係列的目的在於對《WCF技術剖析》的補充,會對書中的一些內容進行展開講述,同時會囊括很多由於篇幅的原因忍痛割棄的內容。

本係列的第一篇,我將會對WCF的基本架構作一個大致的講解。不過,一改傳統對WCF的工作流程進行平鋪直敘,我將另辟蹊徑,借助於我們熟悉的ASP.NET作為請求處理平台,通過一個簡單的托管程序模擬整個WCF客戶端和服務端的架構。本篇文章的大部分內容節選自《WCF技術剖析(卷1)》第八章。(

在2007年9月份,我曾經寫了三篇詳細介紹IIS架構和ASP.NET運行時管道的文章,深入介紹了IIS 5.x與IIS 6.0HTTP請求的監聽與分發機製,以及ASP.NET運行時管道對HTTP請求的處理流程:

[原創]ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI
[原創]ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part I
[原創]ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II

很多人留言為何沒有IIS 7的介紹。在寫作《WCF深入剖析》中,為了剖析基於IIS的WCF服務寄宿(Hosting),再次對相關內容進行了研究,在這裏一並與大家分享。(

上麵一篇文章中,我們對不同版本的IIS,以及ASP.NET得的實現機製進行了詳細而深入的分析。在介紹IIS7.0的時候,我們談到,HTTP.SYS+W3SVC實現了基於HTTP的請求監聽,在此基礎上引入了三組網絡監聽器(Listener)和監聽適配器(Adapter),實現了基於TCP、Named Pipes和MSMQ的網絡監聽。由於IIS 7提供了基於非HTTP網絡協議的監聽支持,那麼就意味著當我們當我們通過IIS進行WCF服務寄宿(Hosting)的時候,可以采用非HTTP的通信方式。在本篇文章中,我們將通過一個簡單實例介紹進行非HTTP的IIS服務寄宿。(

通過《再談IIS與ASP.NET管道》的介紹,相信讀者已經對IIS和ASP.NET的請求處理管道有了一個大致的了解,在此基礎上去理解基於IIS服務寄宿的實現機製就顯得相對容易了。概括地說,基於IIS的服務寄宿依賴於兩個重要的對象:System.ServiceModel.Activation.HttpModule和System. ServiceModel.Activation.HttpHandler。(

在《基於IIS的WCF服務寄宿(Hosting)實現揭秘》中,我們談到在采用基於IIS(或者說基於ASP.NET)的WCF服務寄宿中,具有兩種截然不同的運行模式:ASP.NET並行(Side by Side)模式和ASP.NET兼容模式。對於前者,WCF通過HttpModule實現了服務的寄宿,而對於後者,WCF的服務寄宿通過一個HttpHandler實現。隻有在ASP.NET兼容模式下,我們熟悉的一些ASP.NET機製才能被我們使用,比如通過HttpContext的請求下下文;基於文件或者Url的授權;HttpModule擴展;身份模擬(Impersonation)等。

由於在ASP.NET兼容模式下,ASP.NET采用與.aspx Page完全一樣的方式處理基於.svc的請求,換言之,我們就可以借助當前HttpContext的SessionState維護會話狀態,進而創建一個支持會話的WCF Service。接下來,我們就通過一個簡單的例子,一步步地創建這樣的會話服務。本案例采用如圖1所示的3層結構。(

本篇文章來源於幾天前一個朋友向我谘詢的問題。問題是這樣的,他說他采用ASP.NET應用程序的方式對定義的WCF服務進行寄宿(Hosting),並使用配置的方式對服務的BaseAddress進行了設置,但是在創建ServiceHost的時候卻拋出InvalidOperationException,並提示相應Address Scheme的BaseAddress找不到。我意識到這可能和WCF中用於判斷服務寄宿方式的邏輯有關,於是我讓這位朋友將相同的服務寄宿代碼和配置遷移到GUI程序或者Console應用中,看看是否正常。結果如我所想,一切正常,個人覺得這應該是WCF的一個Bug。今天撰文與大家討論,看看大家對這個問題有何見解。(



作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-30 14:34:10

  上一篇:go  嵌入式X86、ARM、MIPS架構對比 arm芯片將成主流?
  下一篇:go  機器視覺技術背後的行業趨勢