C#自界說HttpFilter模塊完美實例。本站提示廣大學習愛好者:(C#自界說HttpFilter模塊完美實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C#自界說HttpFilter模塊完美實例正文
本文實例講述了C#自界說HttpFilter模塊完美的辦法,分享給年夜家供年夜家參考。詳細完成辦法以下:
1、配景
近期因為要針對項目做用戶操作日記,但不想在每一個辦法裡去增長代碼,寫入用戶日記。由於如許詳細的辦法違反職責單一的准繩,若前期日記內容格局產生變革,或其他甚麼需求,該辦法代碼重要一變在變,故應用HttpModule模塊來完成此功效,感興致的同伙可以參考:關於HttpHandler與HttpModule的懂得和運用辦法
經由現實應用與完美,如今可以再次總結下。
2、攔阻機會
如今的版本中,攔阻的根據是,在每次要求產生的進程中,攔阻掌握器類要求,重定向http輸入流,並剖析出Controller與Action,接上去查找能否無方法監控了此掌握器,如有,則剖析出要求輸出參數,與此次要求輸入內容,存儲在FilterContext中,交給該辦法,完成響應邏輯。
因為在最後的寫法中,是針對一切的要求停止流的重定向,在asmx下,會碰到成績,只需重定向了,挪用辦事的客戶端會提醒400 Http Bad Request 。這個詳細的毛病緣由,還不清晰,但恰是因為該毛病,讓我發明,我之前攔阻的機會是毛病的,理應放在要求之前,斷定能否知足攔阻的規矩,若知足,則重定向輸入流。
3、讀取用戶名
在Module模塊中總會出點成績,最初應用了Cookie記住用戶名,並直接界說為FilterContext一個屬性。說明下如許做的緣由:因為記住用戶名的方法有許多,如Session、Cookie,即讀取用戶名的方法是可變的,所以盡量將變更的內容在後面處理,如許監聽掌握器的辦法,直接依據該屬性獲得用戶名,不然用戶名的讀取機會,放在每一個監聽掌握器模塊以後,讀取方法一旦產生變革,一切的模塊都要轉變,固然也能夠經由過程繼續一個base類來防止這麼年夜的轉變。
在這裡我想表達的意思是:我們做相似底層庫的器械,盡量穩固,將變更點集中在庫自己,如許依附該庫的運用能力穩固。若.net版本更新進程中,API都不穩固,想必我們也不會在去應用它。
4、運用之寫入日記
典范例子以下:
[FilterMethod("Login", "Login")]
public void Login(FilterContext context)
{
//解析輸入內容,這裡針對要監聽的掌握器和辦法來寫的
var arr = context.OutputBody.Split('|');
var log = string.Format("userName:{0} password:{1}",arr);
FilterLog.Log.Info(log);
}
該辦法表達的意思是,監控LoginController的Login辦法。因為我們須要剖析要求輸入成果,所以剖析的規矩,與掌握器是強依附的,掌握器的辦法是怎樣前往數據的,我們此處就要依據規矩解析。我在項目中應用的是Json,所以監控的處所都須要Json的反序列化,這裡僅僅是一個Demo。
別的一個辦法可以監聽一個掌握器下的多個辦法,或許多個掌握器。如許是旨在處理有許多Action,輸出參數和輸入參數都是雷同的,能夠因為營業分歧,僅僅在辦法名和外部完成中有分歧。
5、運用之更新緩存
起首關於Cache的運用,可以讀下此文章,Asp.Net Cache高等用法。
因為此處我沒有寫例子,先描寫我在項目中應用的情形。體系有許多數據字典,在要求該數據字典時,法式起首從數據庫加載字典數據,並放入緩存,此時放入緩存有個技能,設置過時時光,並設置移除緩存前的回調,我們來看看詳細的辦法界說:
//
// 摘要:
// 將對象與依附項、到期戰略和可用於在從緩存中移除項之前告訴運用法式的拜托一路拔出到 System.Web.Caching.Cache 對象中。
//
// 參數:
// key:
// 用於援用對象的緩存鍵。
//
// value:
// 要拔出到緩存中的對象。
//
// dependencies:
// 該項的文件依附項或緩存鍵依附項。當任何依附項更改時,該對象即有效,並從緩存中移除。假如沒有依附項,則此參數包括 null。
//
// absoluteExpiration:
// 所拔出對象將到期並被從緩存中移除的時光。要防止能夠的當地時光成績(例如從尺度時光改成夏時制),請應用 System.DateTime.UtcNow
// 而不是 System.DateTime.Now 作為此參數值。假如應用相對到期,則 slidingExpiration 參數必需設置為 System.Web.Caching.Cache.NoSlidingExpiration。
//
// slidingExpiration:
// 緩存對象的前次拜訪時光和對象的到期時光之間的時光距離。假如該值等效於 20 分鐘,則對象在最初一次被拜訪 20 分鐘以後將到期並被從緩存中移除。假如應用可調到期,則
// absoluteExpiration 參數必需設置為 System.Web.Caching.Cache.NoAbsoluteExpiration。
//
// onUpdateCallback:
// 從緩存中移除對象之前將挪用的拜托。可使用它來更新緩存項並確保緩存項不會從緩存中移除。
//
// 異常:
// System.ArgumentNullException:
// key、value 或 onUpdateCallback 參數為 null。
//
// System.ArgumentOutOfRangeException:
// 將 slidingExpiration 參數設置為小於 TimeSpan.Zero 或年夜於一年的等效值。
//
// System.ArgumentException:
// 為要添加到 Cache 中的項設置 absoluteExpiration 和 slidingExpiration 參數。- 或 -dependencies
// 參數為 null,absoluteExpiration 參數設置為 System.Web.Caching.Cache.NoAbsoluteExpiration
// 而且 slidingExpiration 參數設置為 System.Web.Caching.Cache.NoSlidingExpiration。
public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);
細心看看onUpdateCallback參數的描寫:從緩存中移除對象之前將挪用的拜托。可使用它來更新緩存項並確保緩存項不會從緩存中移除。
我在把數據字典放入緩存的同時傳遞讀取緩存的拜托,如許在自動移除緩存或許緩存過時時都將再次挪用此拜托,將數據字典再次放入緩存。所以一旦數據字典產生了變革,如增刪改,那末就自動將字典緩存移除,它便可以主動更新過去,是否是很便利呢。
差別於寫操作日記,不外是處置邏輯產生了變更,他們都須要要求的輸出和輸入。
6、其他
1.因為應用HttpModule來完成此功效,如需正常運轉,須要在WebConfig中注冊該模塊。詳見Demo。
2.項目中應用了Log4Net記載文今天志,並可以依據功效分類。詳見:Log4Net日記分類保護。
完全實例代碼點擊此處本站下載。
願望本文所述對年夜家的C#法式設計有所贊助。