最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#自定義HttpFilter模塊完善實例

 更新時間:2014年10月27日 12:58:12   投稿:shichen2014  
這篇文章主要介紹了C#自定義HttpFilter模塊完善的方法,以實例的形式具體講述了C#自定義HttpFilter模塊的原理與完善的方法,非常實用,需要的朋友可以參考下

本文實例講述了C#自定義HttpFilter模塊完善的方法,分享給大家供大家參考。具體實現(xiàn)方法如下:

一、背景

近期由于要針對項目做用戶操作日志,但不想在每個方法里去增加代碼,寫入用戶日志。因為這樣具體的方法違背職責單一的原則,若后期日志內(nèi)容格式發(fā)生變更,或其他什么需求,該方法代碼主要一變在變,故使用HttpModule模塊來完成此功能,感興趣的朋友可以參考:關(guān)于HttpHandler與HttpModule的理解和應(yīng)用方法

經(jīng)過實際運用與完善,現(xiàn)在可以再次總結(jié)下。

二、攔截時機

現(xiàn)在的版本中,攔截的依據(jù)是,在每次請求發(fā)生的過程中,攔截控制器類請求,重定向http輸出流,并分析出Controller與Action,接下來查找是否有方法監(jiān)控了此控制器,若有,則分析出請求輸入?yún)?shù),與此次請求輸出內(nèi)容,存儲在FilterContext中,交給該方法,完成相應(yīng)邏輯。

由于在最初的寫法中,是針對所有的請求進行流的重定向,在asmx下,會遇到問題,只要重定向了,調(diào)用服務(wù)的客戶端會提示400 Http Bad Request 。這個具體的錯誤原因,還不清楚,但正是由于該錯誤,讓我發(fā)現(xiàn),我之前攔截的時機是錯誤的,理應(yīng)放在請求之前,判斷是否滿足攔截的規(guī)則,若滿足,則重定向輸出流。

三、讀取用戶名

在Module模塊中總會出點問題,最后使用了Cookie記住用戶名,并直接定義為FilterContext一個屬性。解釋下這樣做的原因:由于記住用戶名的方式有很多,如Session、Cookie,即讀取用戶名的方式是可變的,所以盡可能將變化的內(nèi)容在前面解決,這樣監(jiān)聽控制器的方法,直接根據(jù)該屬性獲取用戶名,否則用戶名的讀取時機,放在每個監(jiān)聽控制器模塊之后,讀取方式一旦發(fā)生變更,所有的模塊都要改變,當然也可以通過繼承一個base類來避免這么大的改變。

在這里我想表達的意思是:我們做類似底層庫的東西,盡可能穩(wěn)定,將變化點集中在庫本身,這樣依賴該庫的應(yīng)用才能穩(wěn)定。若.net版本更新過程中,API都不穩(wěn)定,想必我們也不會在去使用它。

四、應(yīng)用之寫入日志

典型例子如下:

復(fù)制代碼 代碼如下:
[FilterMethod("Login", "Login")]
public void Login(FilterContext context)
{
    //解析輸出內(nèi)容,這里針對要監(jiān)聽的控制器和方法來寫的
    var arr = context.OutputBody.Split('|');
    var log = string.Format("userName:{0} password:{1}",arr);
    FilterLog.Log.Info(log);
}

該方法表達的意思是,監(jiān)控LoginController的Login方法。由于我們需要分析請求輸出結(jié)果,所以分析的規(guī)則,與控制器是強依賴的,控制器的方法是怎么返回數(shù)據(jù)的,我們此處就要根據(jù)規(guī)則解析。我在項目中使用的是Json,所以監(jiān)控的地方都需要Json的反序列化,這里僅僅是一個Demo。

另外一個方法可以監(jiān)聽一個控制器下的多個方法,或者多個控制器。這樣是旨在解決有很多Action,輸入?yún)?shù)和輸出參數(shù)都是相同的,可能由于業(yè)務(wù)不同,僅僅在方法名和內(nèi)部實現(xiàn)中有不同。

五、應(yīng)用之更新緩存

首先關(guān)于Cache的應(yīng)用,可以讀下此文章,Asp.Net Cache高級用法

由于此處我沒有寫例子,先描述我在項目中運用的情況。系統(tǒng)有很多數(shù)據(jù)字典,在請求該數(shù)據(jù)字典時,程序首先從數(shù)據(jù)庫加載字典數(shù)據(jù),并放入緩存,此時放入緩存有個技巧,設(shè)置過期時間,并設(shè)置移除緩存前的回調(diào),我們來看看具體的方法定義:

復(fù)制代碼 代碼如下:
//
// 摘要:
//     將對象與依賴項、到期策略以及可用于在從緩存中移除項之前通知應(yīng)用程序的委托一起插入到 System.Web.Caching.Cache 對象中。
//
// 參數(shù):
//   key:
//     用于引用對象的緩存鍵。
//
//   value:
//     要插入到緩存中的對象。
//
//   dependencies:
//     該項的文件依賴項或緩存鍵依賴項。當任何依賴項更改時,該對象即無效,并從緩存中移除。如果沒有依賴項,則此參數(shù)包含 null。
//
//   absoluteExpiration:
//     所插入對象將到期并被從緩存中移除的時間。要避免可能的本地時間問題(例如從標準時間改為夏時制),請使用 System.DateTime.UtcNow
//     而不是 System.DateTime.Now 作為此參數(shù)值。如果使用絕對到期,則 slidingExpiration 參數(shù)必須設(shè)置為 System.Web.Caching.Cache.NoSlidingExpiration。
//
//   slidingExpiration:
//     緩存對象的上次訪問時間和對象的到期時間之間的時間間隔。如果該值等效于 20 分鐘,則對象在最后一次被訪問 20 分鐘之后將到期并被從緩存中移除。如果使用可調(diào)到期,則
//     absoluteExpiration 參數(shù)必須設(shè)置為 System.Web.Caching.Cache.NoAbsoluteExpiration。
//
//   onUpdateCallback:
//     從緩存中移除對象之前將調(diào)用的委托??梢允褂盟鼇砀戮彺骓棽⒋_保緩存項不會從緩存中移除。
//
// 異常:
//   System.ArgumentNullException:
//     key、value 或 onUpdateCallback 參數(shù)為 null。
//
//   System.ArgumentOutOfRangeException:
//     將 slidingExpiration 參數(shù)設(shè)置為小于 TimeSpan.Zero 或大于一年的等效值。
//
//   System.ArgumentException:
//     為要添加到 Cache 中的項設(shè)置 absoluteExpiration 和 slidingExpiration 參數(shù)。- 或 -dependencies
//     參數(shù)為 null,absoluteExpiration 參數(shù)設(shè)置為 System.Web.Caching.Cache.NoAbsoluteExpiration
//     并且 slidingExpiration 參數(shù)設(shè)置為 System.Web.Caching.Cache.NoSlidingExpiration。
public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);

仔細看看onUpdateCallback參數(shù)的描述:從緩存中移除對象之前將調(diào)用的委托??梢允褂盟鼇砀戮彺骓棽⒋_保緩存項不會從緩存中移除。

我在把數(shù)據(jù)字典放入緩存的同時傳遞讀取緩存的委托,這樣在主動移除緩存或者緩存過期時都將再次調(diào)用此委托,將數(shù)據(jù)字典再次放入緩存。所以一旦數(shù)據(jù)字典發(fā)生了變更,如增刪改,那么就主動將字典緩存移除,它就可以自動更新過來,是不是很方便呢。

區(qū)別于寫操作日志,不過是處理邏輯發(fā)生了變化,他們都需要請求的輸入和輸出。

六、其他

1.由于使用HttpModule來完成此功能,如需正常運行,需要在WebConfig中注冊該模塊。詳見Demo。

2.項目中使用了Log4Net記錄文本日志,并可以根據(jù)功能分類。詳見:Log4Net日志分類維護。

完整實例代碼點擊此處本站下載

希望本文所述對大家的C#程序設(shè)計有所幫助。

相關(guān)文章

  • C#實現(xiàn)Check Password和鎖定輸錯密碼鎖定賬戶功能

    C#實現(xiàn)Check Password和鎖定輸錯密碼鎖定賬戶功能

    C#實現(xiàn)的Check Password,并根據(jù)輸錯密碼的次數(shù)分情況鎖定賬戶:如果輸入錯誤3次,登錄賬戶鎖定5分鐘并提示X點X分后重試登錄,具體實現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧
    2020-01-01
  • C#簡單讀取主機上所有進程的方法

    C#簡單讀取主機上所有進程的方法

    這篇文章主要介紹了C#簡單讀取主機上所有進程的方法,涉及C#進程的遍歷讀取操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • Unity實現(xiàn)俄羅斯方塊

    Unity實現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C#向Word插入排版精良的TextBox

    C#向Word插入排版精良的TextBox

    這篇文章主要為大家詳細介紹了C#向Word插入排版精良的Text Box的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • C#利用Task實現(xiàn)任務(wù)超時多任務(wù)一起執(zhí)行的方法

    C#利用Task實現(xiàn)任務(wù)超時多任務(wù)一起執(zhí)行的方法

    這篇文章主要給大家介紹了關(guān)于C#利用Task實現(xiàn)任務(wù)超時,多任務(wù)一起執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友下面來一起看看吧。
    2017-12-12
  • C#中多線程更新UI控件的常用方案

    C#中多線程更新UI控件的常用方案

    在C#中,特別是在使用Windows窗體(WinForms)或WPF(Windows Presentation Foundation)進行UI開發(fā)時,處理多線程與UI控件的交互需要特別小心,本文給大家介紹了幾種在C#中安全地從多線程更新UI控件的常用方案,需要的朋友可以參考下
    2024-07-07
  • C#圖像對比度調(diào)整的方法

    C#圖像對比度調(diào)整的方法

    這篇文章主要介紹了C#圖像對比度調(diào)整的方法,涉及C#實現(xiàn)圖像對比度操作的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • 詳解C#中delegate/event/EventHandler/Action/Func的使用和區(qū)別

    詳解C#中delegate/event/EventHandler/Action/Func的使用和區(qū)別

    這篇文章主要為大家詳細介紹了C#中delegate、event、EventHandler、Action和Func的使用與區(qū)別,文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-04-04
  • utf8編碼檢測方法分享

    utf8編碼檢測方法分享

    這篇文章主要介紹了utf8編碼檢測方法示例,需要的朋友可以參考下
    2014-02-02
  • 二叉樹的遍歷算法(詳細示例分析)

    二叉樹的遍歷算法(詳細示例分析)

    以下代碼是對二叉樹的遍歷算法進行了分析介紹,需要的朋友可以參考下
    2013-05-05

最新評論

安岳县| 金华市| 芒康县| 南江县| 咸宁市| 宜州市| 白银市| 澎湖县| 康平县| 泽库县| 甘泉县| 石河子市| 休宁县| 隆回县| 蚌埠市| 宜阳县| 郸城县| 永嘉县| 山阴县| 武川县| 镇原县| 开封市| 偏关县| 疏附县| 西华县| 娄底市| 平凉市| 宿州市| 宣汉县| 藁城市| 青州市| 万宁市| 石嘴山市| 广丰县| 阜阳市| 广平县| 海宁市| 南和县| 桂林市| 万州区| 台前县|