2013年1月1日 星期二

系統Memo - Cookie的使用

串流服務的http request分兩種,一種是manifest request,一種是chunk request;(manifest request: http://myserver.com/videopath/sample.ism/manifest?queryString,chunk request: /videopath/sample.ism?QualityLevels(128000)&Fragments(audio=460683900))

queryString只有在manifest request裡才會出現,也無法用程式加在接下來的chunk request上,所以為了辨別連線是屬於哪一個使用者,想到的最好解法就是使用cookie。

cookie的限制有以下幾點:
1. 無法即時改變cookie的值:cookie儲存在client端,在server端建立並設定值之後,由response帶過去client,下一次的request才會抓的到cookie;要改變其中的值或是刪除它,都必須由response通知client端,也就是cookie的變更一定存在request和response的時間差。

2. 瀏覽器的安全設定不相同:由於服務是由兩台不同domain的server提供,認證程式發給的cookie屬於第三方,這方面Chrome比較開放,並不禁止任何第三方cookie寫入,對認證沒有什麼影響;IE有限制第三方cookie,必須在cookie header中加入P3P設定 - HttpContext.Current.Response.AddHeader("P3P", "CP=\"CAO PSA OUR\""); Safari一樣有限制第三方cookie,且對於Domain的認定並不是看cookie內的設定來決定,而是直接看來源,這就很麻煩了,代表為了Safari一種瀏覽器,我必須將兩種服務放在同一個domain下。

3. 相同的request url不會更新cookie:也就是說,如果我要把cookie的值當作session用,我必須確定不同session的request url不會一樣,所攜帶的cookie值才會不一樣;經測試,相同的url無視於response的更新指令,而被瀏覽器視作cookie無須更新。

4. cookie允許設定string以外的值,但是request只取的到string的值

總而言之,cookie並不好用,
如果能夠像Wowza那樣將sessionid加在url上就不用被cookie搞了。


2012年10月17日 星期三

系統Memo - IHttpModule 中使用Session State

這個問題其實挺弔詭的,沒有什麼文件清楚的寫出來(該死的微軟)
要在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月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。

系統Memo - IIS Server 掛載網路位置的磁碟機 Update

承上一篇筆記,
去改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即可。


2010年1月9日 星期六

In The End

I still lost you.

其實我真的不知道該怎麼反應了。

也許是腦袋裡早就描繪過今天的結果,我並沒感受到想像中的錐心刺骨;

也許我根本沒有自以為的這麼喜歡你,雖然只要一想到心臟就跟著糾結。

好麻吉們知道了都紛紛打電話來問我還好嗎,但我該怎麼回答?
我還好?
擺明了騙人,我一點都不好。
我很難過?
但我沒哭,一滴眼淚都流不出來。
所以我實在回答不出我到底好不好。

事情總是已成定局,多想無用,育質也這麼說,
於是我開始試著不去想,把它鎖在盒子裡,加上大鐵鍊。
有時腦袋放空,會有一點點從盒子邊緣溢出,瞬間充滿整個腦袋、整個心臟,
然後又是一陣劇痛,
我不得不喚出理智將它再度封閉。
而我似乎越來越熟練了...

這是逃避,沒錯!
那麼誰來告訴我,面對這種事情,要怎麼樣才叫勇敢呢?

2009年2月7日 星期六

痞子蔡

這次過年,照例的回到嘉義老家團圓,
也照例"難得"的跟表哥聊了一下,
我說我以後想學室內設計,
他卻回答:"你很喜歡小室哲哉喔?"
我:"蛤?"
表哥:"小室哲哉啊!唱片製作人。"
我: "我知道啊!但這跟室內設計有什麼關係?"
表哥:" '小室 ' 哲哉啊,哈哈!"
我:"..."

這時我終於確定,寫小說的人腦子裡裝的都跟平常人不一樣,
幽默感也自不同...
不過跟表哥的幽默感比起來,九把刀的比較接近我的tone,
像是把海蔘放到褲襠裡露一截出來之類的...

好吧,順便幫他的新書打打廣告好了,
雖然沒幾個人在看這網誌,我總是盡人事了,
把網誌搞得這麼無聊我也不願意啊....

回眸
寫的是三段小故事,
個人覺得最好看的是第一段,
雖然前半部的敘事不怎麼樣,搭上後半部的發酵倒是效果不錯!

第二段應該是憑空想像的吧!表哥厲害歸厲害,無厘頭歸無厘頭,
這種天馬行空的故事還是無法比那種在周遭會發生的愛情小品寫的好。

第三段呢...是遊記,不予置評,
因為看完就真的僅僅覺得它是篇遊記...

哈哈,
說這麼多,真的要我掏錢買我還會猶豫咧~幸好他都會拿來送~