Jen

在不同的WebRequest中讓Session有作用

最近幫手邊的一個案子寫一些測試程式,也是跟會員積點有關的。說到這個案子其實蠻悲慘的,不斷的修修改改,正常、有bug沒被發現、有bug、有bug、正常、有bug、正常、有bug又沒被發現……搞的我頭昏昏。對一個程式設計師而言,良好的註解習慣(以前超不愛寫註解的)及文件的建立(現在也沒有什麼建文件的習慣@@)對維護一個長期的程式系統來說,是很重要的(如果你不想搞死你自已的話),別說年約是一年了,有時候看著自已兩個星期前寫的程式都想給個「幹」,只能說寫程式不能像去外頭把妹一樣 太漂泊。

 

其實有很多不必要的修改,如果能在前期做一個很完善的規劃及完整的測試,後期也不用維護的這麼辛苦,只能說這些都是我該學習的經驗,這個案子讓我其實學到很多。

 

話又扯遠了,

 

會員積點的流程是這樣的,

 

會員登入- - - > 輸入序號 (積點成功 or 積點失敗)- - -> 會員登出

 

輸入序號不管成功或失敗都要記錄在log檔裏面。為什麼要做這件事,就是要反覆測試會員積點這一個流程會不會有問題,我要假設有N個會員來登入,然後輸入任何有可能的值,不管成功失敗,最後登出,做了N次之後,看資料庫的結果是否是我們所預期的,這有點像在做整合測試,但在這之前,要確定做好「會員登入」、「輸入序號」、「會員登出」等單元的測試,然後把這些結果寫進log檔,當一個樣本,看看本人所寫的程式是否經得起這些虛擬樣本的蹂躪。

 

需要的WebRequest如下:

 

會員登入

url : /m/login

method:post

params:"mid={0}&psd={1}&name={2}"

 

輸入序號

url : /m/wkey

method:post

params:"key={0}"

 

會員登出

url:/m/logout

method:get

params:無

 

 

用WebRequest來串以上這個流程,第一個遇到的問題就是Session的問題,怎麼在不同的WebRequest當中,繼續讓Session有效。

 

ASP.NET Session的原理是這樣的,

在ASP.NET 有使用到Session的話,會在cookie寫入一個ASP.NET_SessionId,這個值是經由.Net加密過後的值,當你再一次發出Request的時候,就會依這個cookies找到對應的Session。

rstest

 

 

所以重點就是你要把Cookie保留下來,然後在放在各個WebRqeust當中,寫法就是

 

先建立一個container

/// <summary>
/// Session是看Cookies中的SessionId.
/// </summary>
private CookieContainer session = new CookieContainer();

 

 

/// <summary>

/// 登入的功能.

/// </summary>

HttpWebRequest myRequest =
    (HttpWebRequest)WebRequest.Create(strUrl + Action);

myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = bs.Length;

/* 最主要就是這一行,在各個不同的WebRequest 中指定相同的CookieContainer */
myRequest.CookieContainer = session;

//­把要丟的參數加到WebRequest的stream當中
using (Stream reqStream = myRequest.GetRequestStream())
{
    reqStream.Write(bs, 0, bs.Length);
    reqStream.Close();
}
using (WebResponse wr = myRequest.GetResponse())
{
}

 

 

 

/// <summary>

/// 在另一個function中.

/// </summary>

HttpWebRequest myRequest =
    (HttpWebRequest)WebRequest.Create(strUrl + Action);

myRequest.Method = "GET";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.CookieContainer = session;
// 
using (WebResponse wr = myRequest.GetResponse())
{
    HttpWebResponse hwr = (HttpWebResponse)wr;
    StreamReader _sr = new StreamReader(wr.GetResponseStream(), Encoding.UTF8);
    strRS = (hwr.StatusCode == HttpStatusCode.OK) ? _sr.ReadToEnd() : hwr.StatusCode.ToString();
    _sr.Close();
}
return strRS;

 

 

好啦, 廢話很多, 重點只有一行CookieContainer session = new CookieContainer();

 

世界上最難的就是明明只有一行重點的文章,卻硬要掰出很多行,讓人覺得你有在用心,是個假像,哇哈哈哈。

 

其他的就請問google大師吧http://goo.gl/wwts,這邊只是個備忘錄.

0 意見: