DotNetNuke 5 C#版本解讀之2--HTTP Modules

在前面文章里說明了DNN的架構,下面這個圖應該說是更加能夠全面的讓你去了解它的結構:

DNN-Architecture-NK20091201.png

如果你是個asp.net新手建議你看看前面這部分,因為它會向你介紹什么是http module,以及其他的一些概念。我想通過你讀這篇文章來明白asp.net的機制,明白一些深層次的東西。我試著讓大家我寫的東西時不僅僅是跟著我去做某件事,而是了解了它。甚至去了解為什么要去做這件事。 廢話太多了。。。

在進入主題http module之前需要你先了解幾個概念,HTTP Pipeline.維基百科上對它的解釋如下:

HTTP pipelining is a technique in which multiple HTTP requests are written out to a single socket without waiting for the corresponding responses. Pipelining is only supported in HTTP/1.1, not in 1.0.

The pipelining of requests results in a dramatic improvement[citation needed] in page loading times, especially over high latency connections such as satellite Internet connections.

Since it is usually possible to fit several HTTP requests in the same TCP packet, HTTP pipelining allows fewer TCP packets to be sent over the network, reducing network load.

Non-idempotent methods like POST should not be pipelined. Sequences of GET and HEAD requests can be always pipelined. A sequence of other idempotent requests like GET, HEAD, PUT and DELETE can be pipelined or not depending on whether requests in the sequence depend on the effect of others.[1]

HTTP pipelining requires both the client and the server to support it. HTTP/1.1 conforming servers are required to support pipelining. This does not mean that servers are required to pipeline responses, but that they are required not to fail if a client chooses to pipeline requests.

http://en.wikipedia.org/wiki/HTTP_pipelining

說白了就是不需要等待服務器的回應向服務器發送多個http請求,它大大降低了頁面的加載時間。

Asp.net 提供了好幾種方式來實現http pipeline。其中用的比較廣泛的就是我們這里所說的http Module,一種用戶自定義組件方式。

如果你英文好點建議你看如下這個鏈接來了解下HTTP Pipeline和http module,

http://msdn.microsoft.com/en-us/magazine/cc301362.aspx

http://msdn.microsoft.com/en-us/library/ms178473(v=VS.80).aspx

如果想看著舒服點的中文建議你看如下這位大哥寫的介紹http請求處理流程的文章:

http://en.wikipedia.org/wiki/HTTP_pipelining

Http Handler的介紹:

http://www.tracefact.net/Asp-Net-Architecture/Introduction-to-Http-Handler.aspx

以及HTTP Module的介紹:

http://www.tracefact.net/Asp-Net/Introduction-to-Http-Module.aspx

里面包含了很多例子。你可以邊看邊學。而且講得也非常好。

如果你認真看完了上面的內容我相信你已經了解了HTTP Module的作用。你也會了解了.net的項目中Global.asax是干嘛的了。大致的請求流程如下圖:

?2010072102323348.gif

?

DNN 中HTTP Modules的演變和HTTP Module的事件

現在我們來看DNN的源代碼有一部分叫做Http Modules。

?2010072102330392.gif

其實DNN之前的版本也是把http modules都放在了global.asax.vb里面(因為之前都是vb版本)。后來把這些模塊給放到http module單獨這個模塊了。原因如下:

  1. 管理員可以在系統中添加/移除這些模塊,因為本身是個module。
  2. 開發人員可以能夠在不修改主程序也就是DNN.liabrary的情況下可以修改或者替換這些HTTP modules。
  3. 給大家提供了一個擴展HTTP Pipeline的模板。因為你可以自己加上自己的HTTP Module

上面我提供的參考文章里也有介紹.net framework自帶的一些http module都在.net framewrok下有個config文件里放著,我們擴展后的HTTP Module也需要在

DNN的web.config中配置:?

?2010072102333089.jpg

我們知道HTTP Module都是繼承了IhttpModule這個接口。

?2010072102334845.jpg

在Init方法中我們為context的某個事件來個委托。

HTTP Module的事件分為三種

  1. 應用程序執行之前發生。

主要有:

?BeginRequest:每次程序向服務器發送請求它都會被觸發。

?AuthenticateRequest: 表示請求準備好服務器端的認證,認證模式下使用

?AuthorizeRequest: 表示請求準備好服務器端授權。

?ResolveRequestCache: 在Output Cache模塊中通過使用緩存讓請求更短。

?AcquireReuqestState: 表示能獲得請求前的狀態。

?PreRequesthandlerExecute: 在程序的http請求發生前你可以觸發的最后一個事件。

應用程序執行之后發生:

PostRequestHandlerExecute:此事件在執行 HTTP 處理程序之后發生。 ReleaseRequestState:將會話狀態重新存儲在狀態存儲中。如果您要構建一個自定義

會話狀態模塊,則必須將您的狀態重新存儲在狀態存儲中。

UpdateRequestCache:此事件將輸出重新寫入輸出緩存。如果您要構建自定義緩存模塊,則可以將輸出重新寫入緩存中。

EndRequest:請求已完成。您可能希望構建一個調試模塊,以便將整個請求的信息收集到一起,然后將信息寫入頁面中。

?

DNN中的URL Writer HTTP Module詳細介紹?

URL重寫是一個好的系統必須具備的。DNN的URL重寫也是給大家提供了很多種URL重寫的格式,歸根到底也是為了URL的友好型,以及有利于SEO。下面這個就是DNN的一個友好的URL:

http://www.dotnetnuke.com/RoadMap/FriendlyURLs/tabid/622/default.aspx

如果你對URL的友好型不了解請直接Google下或者是請假下別人,這里不再羅嗦。

? URL重寫實在HTTP Pipeline的請求進行時發生的,所以能夠作為整個應用程序的事件。這里用到的HTTP Module事件是BeginRequest。也就是說每次一個頁面

向服務器發送HTTP Handler請求前通過BeginRequest事件讓服務器相信你的url是接下來請求的那個頁面的。

???? 這種轉換過程借助于SiteUrls.config文件中的正則表達式來完成。

<?xml version="1.0" encoding="utf-8" ?>

<RewriterConfig>

<Rules>

<RewriterRule>

<LookFor>.*/TabId/(\d+)(.*)/Logoff.aspx</LookFor>

<SendTo>~/Admin/Security/Logoff.aspx?tabid=$1</SendTo>

</RewriterRule>

<RewriterRule>

<LookFor>.*/TabId/(\d+)(.*)/rss.aspx</LookFor>

<SendTo>~/rss.aspx?TabId=$1</SendTo>

</RewriterRule>

<RewriterRule>

<LookFor>[ ? ?]*/TabId/(\d+)(.*)</LookFor>

<SendTo>~/Default.aspx?TabId=$1</SendTo>

</RewriterRule>

</Rules>

</RewriterConfig>

?

可以看到里面的節點主要是LookFor和SendTo。沒錯。也就是說當程序發現URL是…tabid/622/rss.aspx時它就會去找到rrs.aspx?Tabid=622來獲取內容。

后面的url是代碼所能是別的url。

相同的道理如果url是

http://localhost/dotnetnuke_community_cs/tabid/21/portalid/0/Default.aspx 那么實際上的url是default.aspx?tabid=21。

當然你如果喜歡你可以強制性的去把某個url絕對比配,不使用正則表達式。

?

<RewriterRule>

<LookFor>.*/XXOO/Url.aspx</LookFor>

<SendTo>~/default.aspx?tabid=622</SendTo>

</RewriterRule>

?

?

?

接下來我們分析下上面給出的基本的DNN url:

http://www.dotnetnuke.com/RoadMap/FriendlyURLs/tabid/622/default.aspx

? http://www.dotnetnuke.com --- 是整個網站的url

? RoadMap/FriendlyURLS---是導航菜單的名字。也就是1級菜單的名字。你可以到DNN官網上試試。

? Tabid/622/ ---是真實的url中的參數(?tabid=622)

? Default.aspx --- DNN中最重要那個頁面吧。。。

?

當然了那個導航菜單是否需要顯示在url中你可以通過web.config文件中friendlyurl部分來設定。可能對于一個小的網站你在主網站下不需要再分類了,

比如不需要分什么product, community等。

?2010072102341962.jpg

?DNN這種URL重寫的方式最大的優點不需要從服務器查找數據來進行url的重寫準備,而是使用正則表達式。我見過很多網站的URL重寫時需要不停地

和數據庫交互,對于大的網站這個很影響性能的。

?

上面這個URL格式是對于SEO有好處的,但是很多時候大家希望有一個容易記住的url也就是傳說中的人性化。但是這個只適合小型網站,你就硬寫入

上面那個配置文件中。DNN5也有一個配置能夠讓URL成為人類友好型的那種。這里不說了。

? DNN的URL重寫也使用了Provider Module模式,別于大家去擴展它的URL重寫。不得不佩服它的擴展性,無處不在啊。。。

?2010072102344391.jpg

?上面既然說它擴展性好,如何去寫一個自己的URL重寫provider呢?

?首先你需要創建一個Provider類是繼承下面這個類的:

?2010072102352358.jpg

然后你在這些方法里面寫入自己公司的url 從寫規則。具體的我會在后面文章里給出例子。寫完這個編譯后,你只需要在web.config中把你的

provider加進來就可以了。

?

ContractedBlock.gifExpandedBlockStart.gif代碼
<friendlyUrl defaultProvider="CustomFriendlyUrl">

<providers>

<clear />

<add name="DNNFriendlyUrl"

type="DotNetNuke.Services.Url.FriendlyUrl.DNNFriendlyUrlProvider,

DotNetNuke.HttpModules.UrlRewrite" includePageName="true"

regexMatch="[ ? a-zA-Z0-9 _-]"/>

<add name="CustomFriendlyUrl"

type="CompanyName.FriendlyUrlProvider, CompanyName.FriendlyUrlProvider" />

</providers>

</friendlyUrl>

?

?

?

上面只是粗略的說明了下DNN的url重寫是如何進行的。代碼級別的研究以及自定義url 規則都會單獨有文章來介紹。

?PS:DNN的URL重寫你如果掌握了,你完全可以把它移植出來到你的項目中。

?

DNN的Exception HTTP Module模塊

上面url重寫部分使用的是BeginRequest事件,而Exception模塊我們需要在整個應用程序發生錯誤時就去執行某個方法。代碼如下:
 
也同時會把這個異常信息存儲到數據庫中來供開發人員分析。
?
DNN的UserOnline HTTP Module
這個Module監聽的是AuthorizeRequest事件。每當一個用戶向服務器端發出身份認證時這個HTTP Module就會向服務器發送請求,useronlineprovider就會執行。
 
? DNN的usernolineprovider主要是使用Cookie來存放唯一標識的。這樣可以防止那些在線的游客被重復記錄。當然了這個功能主要是靠DNN的Scheduler模塊
  在后臺有個線程沒幾分鐘去執行下。 
  DNN UserOnline模塊的代碼級別研究也會在以后一篇文章里介紹。這里你知道原理就行。
? 其它還有Membership,Compression,RequestFilter,Analytics,Compression模塊。Analytics這個功能我覺得對于很多監測網站數據訪問量的人員來說是個很好的參考。
  我會把對它的說明和Requestfilter放在一塊講解。估計接下來Http Module部分還得寫7-8篇文章才行。
 Cheers
 Nic

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276245.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用框架的你,可能早已忽略了這些事件API

DOMContentLoaded&#xff0c;load&#xff0c;beforeunload&#xff0c;unloadHTML 頁面的生命周期包含三個重要事件&#xff1a;DOMContentLoaded —— 瀏覽器已完全加載 HTML&#xff0c;并構建了 DOM 樹&#xff0c;但像 <img> 和樣式表之類的外部資源可能尚未加載完…

調用接口登錄禪道_有java調用api登錄并驗證禪道的實例嗎

展開全部本文實例為大家分享了32313133353236313431303231363533e78988e69d8331333363396466JAVA的短信驗證碼api調用代碼&#xff0c;供大家參考&#xff0c;具體內容如下import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import j…

[Docker]Docker快速上手學習筆記

0. 學習的一些疑問 如何熱更新鏡像(images)&#xff1f;&#xff08;你可以快速啟動或者銷毀容器。這種時間幾乎是實時的&#xff09;如何熱更新游戲服&#xff1f;好處在于各個應用之間環境相互獨立&#xff0c;即使某一個容器崩潰也不會影響到其它容器&#xff1b;每個容器使…

原來 Clipboard 還能復制圖像?原理是什么

在寫了 這個 29.7 K 的剪貼板 JS 庫有點東西&#xff01; 這篇文章之后&#xff0c;收到了小伙伴提的兩個問題&#xff1a;1.clipboard.js 這個庫除了復制文字之外&#xff0c;能復制圖像么&#xff1f;2.clipboard.js 這個庫依賴的 document.execCommand API 已被廢棄了&…

計算機大數據的前景方向_計算機方向,網絡與信息安全和大數據哪個前景好一點?...

大數據是我目前的研究方向之一&#xff0c;我也曾經做過網絡安全相關的項目&#xff0c;主要涉及的是各種網絡環境下數據傳輸的安全處理方案。另外&#xff0c;我曾經給高校的學生做過網絡安全的系列講座&#xff0c;系統地整理過網絡安全的相關內容&#xff0c;所以我來談一談…

Smarty 顯示大括號 | 在Smarty中計算數組元素的長度 | Smarty字符串拼接

參考鏈接&#xff1a;http://hi.baidu.com/bdusnb/item/289d160e6a9c92cd9157183d 參考鏈接&#xff1a;http://hi.baidu.com/mayimu789/item/b565088d047da0d05f0ec16f 參考鏈接&#xff1a;http://blog.sina.com.cn/s/blog_8155e74d0101el2k.html Smarty 3 &#xff1a;大…

ftp協議分析(一)

作者: 肖建彬 | 可以轉載, 轉載時務必以超鏈接形式標明文章原始出處和作者信息及版權聲明網址&#xff1a;http://www.xiaojb.com/archives/it/ftp.shtml根據是使用port模式還是passive模式&#xff0c;ftp使用不同的tcp端口號&#xff0c;在詳細描述ftp前&#xff0c;我們來簡…

JavaScript 元編程

大家好&#xff0c;我是若川。今天給分享一篇來自freecodecamp的好文。我是freecodecamp杭州社區組織者之一&#xff0c;有一群小伙伴一起組織線下分享活動&#xff0c;不過2020年我們杭州社區幾乎沒有活躍&#xff0c;我也沒有什么貢獻。另外&#xff0c;我的公眾號「若川視野…

python 異常處理模塊_擴展Python模塊系列(五)----異常和錯誤處理

在上一節中&#xff0c;討論了在用C語言擴展Python模塊時&#xff0c;應該如何處理無處不在的引用計數問題。重點關注的是在實現一個C Python的函數時&#xff0c;對于一個PyObject對象&#xff0c;何時調用Py_INCREF和Py_DECREF。在編寫C語言代碼時&#xff0c;需要了解Python…

常見的php筆試題(附答案)搜集整理

轉載鏈接&#xff1a;http://www.yaojinbu.com/p/139.html 常見的php筆試題&#xff08;附答案&#xff09;搜集整理 1.在PHP中&#xff0c;當前腳本的名稱&#xff08;不包括路徑和查詢字符串&#xff09;記錄在哪個預定義變量中&#xff1f;而鏈接到當前頁面的URL又記錄在哪個…

Js整理備忘(02)——運算符

1、運算符的表示以及優先級 Javascript&#xff08;以下簡寫為Js&#xff09;的大部分運算符與C或Java是類似的。 記得剛學C語言時老師講的優先級口訣&#xff0c;非常好記&#xff1a;“括、單、算、移、關”“位、邏、條、賦、逗”&#xff0c;此處也可以套用一下&#xff0c…

手寫一個合格的前端腳手架

為什么我們需要一套腳手架為什么我們需要一套腳手架&#xff0c;它能幫助我們解決哪些痛點問題。?前端項目配置越來越繁瑣、耗時&#xff0c;重復無意義的工作?項目結構不統一、不規范?前端項目類型繁多&#xff0c;不同項目不同配置&#xff0c;管理成本高?腳手架也可以是…

第一篇cnblog!

本人才疏學淺&#xff0c;終于通過了cnblog的審核&#xff0c;興奮之余&#xff0c;發表感言——不容易啊&#xff01;在我的博聞里面&#xff0c;隨筆類當然就是技術類的比較多的&#xff0c;特別是實例類的。理論類的大部分放在文章板塊&#xff0c;本人e文特別好(哈哈&#…

解決error 1045: Access denied for user: 'root@localhost' (Using password: YES)

轉載連接&#xff1a;http://jianfw2009.blog.163.com/blog/static/13431366020111016112459158/ 1、先停止mysql服務2、在mysql的目錄下找到my.ini&#xff0c;在[mysqld]后面加上skip-grant-tables3、啟動mysql服務,打開Command Line Client以空密碼登錄4、退出mysql,并停止服…

fillcolor是什么意思_fill是什么意思

1. (使)裝滿;(使)注滿;(使)充滿If you fill a container or area, or if it fills, an amount of something enters it that is enough to make it full.e.g.Fill a saucepan with water and bring to a slow boil...往平底鍋里加滿水,小火煮沸。e.g.She made sandwiches, fill…

利用JMeter進行壓力測試(1)(轉)

轉自&#xff1a;http://www.cnblogs.com/game-over/archive/2010/01/08/1642685.html壓力測試以軟件響應速度為測試目標&#xff0c;尤其是在較短時間內大量并發用戶的同時訪問時&#xff0c;軟件的性能和抗壓能力。 JMeter是一款開源的壓力測試工具&#xff0c;目前最新Rele…

MyISAM InnoDB 區別

轉載鏈接&#xff1a;http://www.php100.com/html/webkaifa/database/Mysql/2011/0326/7789.html MyISAM 和 InnoDB 講解 InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型&#xff0c;這兩個表類型各有優劣&#xff0c;視具體應用而定。基本的差別為&#xff1a;MyISAM…

Git 內部原理圖解——對象、分支以及如何從零開始建倉庫

我們中的許多人每天都在使用 git&#xff0c;但是有多少人知道它的內部是怎么運作的呢&#xff1f;例如我們使用 git commit 時發生了什么&#xff1f;提交&#xff08;commit&#xff09;與提交之間保存的是什么&#xff1f;兩次提交之間難道只是文件的差異&#xff08;dif…

wpsmac和pc版的區別_Mac版WPS Office和微軟Office 2019哪個更好?

眾所周知&#xff0c; macOS系統生態下&#xff0c;有許多界面精美、功能強大、體驗出色的軟件&#xff0c;但提到辦公套件&#xff0c;人們首先想到的還是微軟 Office 套件&#xff0c;其中的Word、 Excel 以及PPT&#xff0c;但用戶體驗并不如意。但現在&#xff0c;蘋果用戶…

A tutorial video for MindManager for free

MindManager 2016 for Windows Essential Training 本人學習的時候使用的是MindManager 2018版本的&#xff0c;和2016版本差異不大。 轉載于:https://www.cnblogs.com/kelamoyujuzhen/p/10253278.html