這個問題其實挺弔詭的,沒有什麼文件清楚的寫出來(該死的微軟)
要在IHttpModule中使用Session有非常多的限制:
1. 網路上眾說紛紜,有人說只在AcquireRequestState和PreRequestHandlerExecute兩個事件中,才有辦法使用Session,但也有人說http module根本沒辦法使用session,造成不少困擾。
2. 經測試,即使是在上述兩個事件中,HttpApplication.Context.Session依然為null,我的猜測是這樣的方法只適用於.aspx之類的http request,其餘一律行不通。(我發的http request是抓.png或是manifest這類的行為)
最後採用的解法是:
http://forums.asp.net/t/1098574.aspx/1
我看不太懂裡面針對handler物件繞來繞去的原因是什麼,只大概猜說是要自己宣告一個Handler類別,產生handler物件,然後用原本的Application.Context.Handler傳進來,藉此啟動SessionStateModule,讓SessionState成為avaliable狀態。
以下只擷取相關部分,RequestBegin之類的事件省略,
Code snippet:
public void Init(HttpApplication application)
{
// following two event handler are both required
application.PostAcquireRequestState += new EventHandler(OnPostAcquireRequestState);
application.PostMapRequestHandler += new EventHandler(OnPostMapRequestHandler);
}
/**
* for the usage of SessionState, replace the original handler with ours, force SessionState to be valiable
**/
public void OnPostMapRequestHandler(Object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
if (application.Context.Handler is IReadOnlySessionState || application.Context.Handler is IRequiresSessionState)
{
// no need to replace the original handler
return;
}
// swap the original handler
application.Context.Handler = new TempHandler(application.Context.Handler);
}
public void OnPostAcquireRequestState(Object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
TempHandler handler = HttpContext.Current.Handler as TempHandler;
if (handler != null)
{
HttpContext.Current.Handler = handler.myHandler;
}
// from this moment, SessionState is valiable
HttpSessionState session = application.Context.Session;
}
/**
* A temp handler used to force the SessionStateModule to load session state
**/
public class TempHandler : IHttpHandler, IRequiresSessionState
{
internal readonly IHttpHandler myHandler; // store original application context handler
public TempHandler(IHttpHandler originalhttpHandler)
{
this.myHandler = originalhttpHandler;
}
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException("InvalidOperationException");
}
public bool IsReusable
{
get { return false; }
}
}
另外,module類別除了繼承IHttpModule以外,必須再繼承IRequiresSessionState。
Anyway,這個方法讓我成功取到Session.SessionID,原理之後再慢慢思考。
2012年10月17日 星期三
2012年10月16日 星期二
系統Memo - IIS Server網站掛載HTTP Module
1. 將C#程式編譯成.dll檔,放置在網站目錄下bin資料夾,與web.config層級相同。
2. web.config設定方式如下:
< configuration >
< system.web >
< customErrors mode="Off" />
< /system.web >
< system.webServer >
< modules >
< add type="NameSpace.ModuleName" name="NameSpace" />
< /modules >
< /system.webServer >
< /configuration >
3. 採用介面為IHttpModules。
2. web.config設定方式如下:
< configuration >
< system.web >
< customErrors mode="Off" />
< /system.web >
< system.webServer >
< modules >
< add type="NameSpace.ModuleName" name="NameSpace" />
< /modules >
< /system.webServer >
< /configuration >
3. 採用介面為IHttpModules。
系統Memo - IIS Server 掛載網路位置的磁碟機 Update
承上一篇筆記,
去改AppPool的設定,使得.NET Framework的版本與DefaultAppPool不一樣,
可能導致之後無法在這個應用程式上掛任何.NET程式。
後來嘗試了另一種方法,其實很直觀,
只是當初沒想到。
1. 一樣新建立一個應用程式,使用DefaultAppPool的設定即可。
2. 注意上一篇講到的帳號密碼部分,這會影響到存取權限。
3. 在應用程式下建立新的虛擬目錄,將路徑指向目標網路磁碟機。
這樣就可以讓.NET程式運作正常,也可以讓程式和網站儲存內容分開。
去改AppPool的設定,使得.NET Framework的版本與DefaultAppPool不一樣,
可能導致之後無法在這個應用程式上掛任何.NET程式。
後來嘗試了另一種方法,其實很直觀,
只是當初沒想到。
1. 一樣新建立一個應用程式,使用DefaultAppPool的設定即可。
2. 注意上一篇講到的帳號密碼部分,這會影響到存取權限。
3. 在應用程式下建立新的虛擬目錄,將路徑指向目標網路磁碟機。
這樣就可以讓.NET程式運作正常,也可以讓程式和網站儲存內容分開。
2012年10月2日 星期二
系統Memo - IIS Server 掛載網路位置的磁碟機
紀錄一下,
這個問題困擾了我兩天,連公司的MIS都覺得莫名其妙,結果看了這篇網誌瞬間解決!
http://maxtellyou.blogspot.tw/2010/02/iis-7.html
大致上有幾點:
1. 在設定實體路徑時必須使用"//磁碟機網路位址/xxx",不能設定為"磁碟機代號:\xxx",因為IIS只支援UNC路徑而不支援網路磁碟機路徑。
2. 雖然說是要在預設網站(Default Web Site)下建立虛擬目錄,但其實是建立一個新的應用程式(Application),並搭配新建立的應用程式集區(ApplicationPool)。
3. 新建立的應用程式集區必須設定為"沒有Managed程式碼"。
4. 在IIS server上必須要有一個與網路磁碟機一模一樣帳號密碼的使用者帳戶,比如說網路磁碟機上開的存取帳號為 testUser / 1234,那麼IIS server上也要有一個帳號 testUser / 1234,只要存在就好,IIS端不一定要用此帳號操作。
5. IIS端建立的新應用程式需設定連線身分為此組帳號密碼,登入類型為clearText即可。
這個問題困擾了我兩天,連公司的MIS都覺得莫名其妙,結果看了這篇網誌瞬間解決!
http://maxtellyou.blogspot.tw/2010/02/iis-7.html
大致上有幾點:
1. 在設定實體路徑時必須使用"//磁碟機網路位址/xxx",不能設定為"磁碟機代號:\xxx",因為IIS只支援UNC路徑而不支援網路磁碟機路徑。
2. 雖然說是要在預設網站(Default Web Site)下建立虛擬目錄,但其實是建立一個新的應用程式(Application),並搭配新建立的應用程式集區(ApplicationPool)。
3. 新建立的應用程式集區必須設定為"沒有Managed程式碼"。
4. 在IIS server上必須要有一個與網路磁碟機一模一樣帳號密碼的使用者帳戶,比如說網路磁碟機上開的存取帳號為 testUser / 1234,那麼IIS server上也要有一個帳號 testUser / 1234,只要存在就好,IIS端不一定要用此帳號操作。
5. IIS端建立的新應用程式需設定連線身分為此組帳號密碼,登入類型為clearText即可。
2010年1月9日 星期六
In The End
I still lost you.
其實我真的不知道該怎麼反應了。
也許是腦袋裡早就描繪過今天的結果,我並沒感受到想像中的錐心刺骨;
也許我根本沒有自以為的這麼喜歡你,雖然只要一想到心臟就跟著糾結。
好麻吉們知道了都紛紛打電話來問我還好嗎,但我該怎麼回答?
我還好?
擺明了騙人,我一點都不好。
我很難過?
但我沒哭,一滴眼淚都流不出來。
所以我實在回答不出我到底好不好。
事情總是已成定局,多想無用,育質也這麼說,
於是我開始試著不去想,把它鎖在盒子裡,加上大鐵鍊。
有時腦袋放空,會有一點點從盒子邊緣溢出,瞬間充滿整個腦袋、整個心臟,
然後又是一陣劇痛,
我不得不喚出理智將它再度封閉。
而我似乎越來越熟練了...
這是逃避,沒錯!
那麼誰來告訴我,面對這種事情,要怎麼樣才叫勇敢呢?
其實我真的不知道該怎麼反應了。
也許是腦袋裡早就描繪過今天的結果,我並沒感受到想像中的錐心刺骨;
也許我根本沒有自以為的這麼喜歡你,雖然只要一想到心臟就跟著糾結。
好麻吉們知道了都紛紛打電話來問我還好嗎,但我該怎麼回答?
我還好?
擺明了騙人,我一點都不好。
我很難過?
但我沒哭,一滴眼淚都流不出來。
所以我實在回答不出我到底好不好。
事情總是已成定局,多想無用,育質也這麼說,
於是我開始試著不去想,把它鎖在盒子裡,加上大鐵鍊。
有時腦袋放空,會有一點點從盒子邊緣溢出,瞬間充滿整個腦袋、整個心臟,
然後又是一陣劇痛,
我不得不喚出理智將它再度封閉。
而我似乎越來越熟練了...
這是逃避,沒錯!
那麼誰來告訴我,面對這種事情,要怎麼樣才叫勇敢呢?
2009年2月7日 星期六
痞子蔡
這次過年,照例的回到嘉義老家團圓,
也照例"難得"的跟表哥聊了一下,
我說我以後想學室內設計,
他卻回答:"你很喜歡小室哲哉喔?"
我:"蛤?"
表哥:"小室哲哉啊!唱片製作人。"
我: "我知道啊!但這跟室內設計有什麼關係?"
表哥:" '小室 ' 哲哉啊,哈哈!"
我:"..."
這時我終於確定,寫小說的人腦子裡裝的都跟平常人不一樣,
幽默感也自不同...
不過跟表哥的幽默感比起來,九把刀的比較接近我的tone,
像是把海蔘放到褲襠裡露一截出來之類的...
好吧,順便幫他的新書打打廣告好了,
雖然沒幾個人在看這網誌,我總是盡人事了,
把網誌搞得這麼無聊我也不願意啊....
回眸
寫的是三段小故事,
個人覺得最好看的是第一段,
雖然前半部的敘事不怎麼樣,搭上後半部的發酵倒是效果不錯!
第二段應該是憑空想像的吧!表哥厲害歸厲害,無厘頭歸無厘頭,
這種天馬行空的故事還是無法比那種在周遭會發生的愛情小品寫的好。
第三段呢...是遊記,不予置評,
因為看完就真的僅僅覺得它是篇遊記...
哈哈,
說這麼多,真的要我掏錢買我還會猶豫咧~幸好他都會拿來送~
也照例"難得"的跟表哥聊了一下,
我說我以後想學室內設計,
他卻回答:"你很喜歡小室哲哉喔?"
我:"蛤?"
表哥:"小室哲哉啊!唱片製作人。"
我: "我知道啊!但這跟室內設計有什麼關係?"
表哥:" '小室 ' 哲哉啊,哈哈!"
我:"..."
這時我終於確定,寫小說的人腦子裡裝的都跟平常人不一樣,
幽默感也自不同...
不過跟表哥的幽默感比起來,九把刀的比較接近我的tone,
像是把海蔘放到褲襠裡露一截出來之類的...
好吧,順便幫他的新書打打廣告好了,
雖然沒幾個人在看這網誌,我總是盡人事了,
把網誌搞得這麼無聊我也不願意啊....
回眸
寫的是三段小故事,
個人覺得最好看的是第一段,
雖然前半部的敘事不怎麼樣,搭上後半部的發酵倒是效果不錯!
第二段應該是憑空想像的吧!表哥厲害歸厲害,無厘頭歸無厘頭,
這種天馬行空的故事還是無法比那種在周遭會發生的愛情小品寫的好。
第三段呢...是遊記,不予置評,
因為看完就真的僅僅覺得它是篇遊記...
哈哈,
說這麼多,真的要我掏錢買我還會猶豫咧~幸好他都會拿來送~
2008年7月20日 星期日
放棄
有點猶豫要怎麼開始...那麼,讓我想想...
這篇文章只是紀錄某段歲月的標的罷了。
以我遲鈍的感覺及認知來看,
我是喜歡妳的,一直到現在依然沒變。
我對追女生這件事很笨拙,我只知道要在校園傳情時送個小東西,再附上卡片一張,
表演活動時或新電影上檔時邀請妳一起去看,
妳上線時找妳聊聊天,
但妳我都不是擅於找話題的人,出去時走在一起卻聊不上幾句,連msn對話都乏善可陳,
這讓我覺得我們的相處似乎永遠不會有火花,
我感到挫折,在我對妳說我喜歡妳之前就常常這樣絆住我的腳步。
妳說我們還是適合當朋友,坦白說,是預料中的結果,
I don't deserve that.
膽小的我不知道被拒絕後該怎麼面對妳,因此我選擇逃避,
神奇的是,在這段時間裡,我沒有刻意迴避,但我們真的連在校園裡也不曾碰見過。
忘記什麼時候了,我們又開始像普通朋友一樣相處,
好像我們的生命曲線終於從平行而再度交會一樣。(雖然難免多了點疙瘩 ^^")
只是,我不再積極的邀約妳,在妳上線的時候還是會點開對話框,然後盯著發呆。
我卻步了,當我沒有收到回應時我那該死的自尊心所自動張開的防禦網,
簡而言之,我害怕再受傷。(也許不是受傷,但我總是怕)
一直到現在,認識妳的第六年,我還沒能逃脫這樣的牢籠。
曾經,
我為了妳傳情時送我的小蛋糕及卡片雀躍不已;
只要妳回我的簡訊不是冷冷的語氣,我就會存下來一看再看;
妳第一次答應跟我去看電影時,我好緊張,話都說不出來,但電影票根我卻一直留著。
現在,
我想也該是時候跳脫出來了,
真正的,放棄妳。
這篇文章只是紀錄某段歲月的標的罷了。
以我遲鈍的感覺及認知來看,
我是喜歡妳的,一直到現在依然沒變。
我對追女生這件事很笨拙,我只知道要在校園傳情時送個小東西,再附上卡片一張,
表演活動時或新電影上檔時邀請妳一起去看,
妳上線時找妳聊聊天,
但妳我都不是擅於找話題的人,出去時走在一起卻聊不上幾句,連msn對話都乏善可陳,
這讓我覺得我們的相處似乎永遠不會有火花,
我感到挫折,在我對妳說我喜歡妳之前就常常這樣絆住我的腳步。
妳說我們還是適合當朋友,坦白說,是預料中的結果,
I don't deserve that.
膽小的我不知道被拒絕後該怎麼面對妳,因此我選擇逃避,
神奇的是,在這段時間裡,我沒有刻意迴避,但我們真的連在校園裡也不曾碰見過。
忘記什麼時候了,我們又開始像普通朋友一樣相處,
好像我們的生命曲線終於從平行而再度交會一樣。(雖然難免多了點疙瘩 ^^")
只是,我不再積極的邀約妳,在妳上線的時候還是會點開對話框,然後盯著發呆。
我卻步了,當我沒有收到回應時我那該死的自尊心所自動張開的防禦網,
簡而言之,我害怕再受傷。(也許不是受傷,但我總是怕)
一直到現在,認識妳的第六年,我還沒能逃脫這樣的牢籠。
曾經,
我為了妳傳情時送我的小蛋糕及卡片雀躍不已;
只要妳回我的簡訊不是冷冷的語氣,我就會存下來一看再看;
妳第一次答應跟我去看電影時,我好緊張,話都說不出來,但電影票根我卻一直留著。
現在,
我想也該是時候跳脫出來了,
真正的,放棄妳。
訂閱:
文章 (Atom)