Web项目
Web项目为Duwamish系统的业务展示层,为客户提供对应用程序的访问界面。
1.PageBase.cs为每个页面的基类,主要是获取页面的URL信息,从Session中获取或设置Customer和Cart信息,另外重写了Web.UI.Page的OnError()事件。捕获页面错误,调用ApplicationLog.WriteError()方法写入日志。
2.ModualBase.cs为系统中每个用户控件的基类,本身继承自UserControl,功能基本同PageBase.cs,用到了Session保存Customer与Cart信息.
3.Cart.cs(购物车)类中封装了所有对购物车的方法与属性。Cart类实现了ISerializable接口对OrderData对象进行序列化与反序列化。
4.Default.aspx页面没有具体很多代码,只是控件的组合。Default.aspx页面的EnableSessionState=true
5.BannerModule.ascx中所有控件的EnableViewState均设置为False,其实也可以直接在控件上设置EnableViewState=false,用户控件没有
EnableSessionState属性.BannerModule数据几乎很少改动,所以启用了缓存,在控件顶部加入代码: “ ```
... @ OutputCache Duration = " 3600 " VaryByParam = " none " VaryByControl = " BannerModule.PathPrefix "
1Duration表示缓存时间为60分钟。VaryByParam="none"表示不据参数值而改变输出缓存,VaryByControl表示据每个请求的PathPrefix来
2进行输出缓存。注意 :如果在指令中使用了 VaryByControl 属性,则不需要包括 VaryByParam 属性。
36.SearchModule.ascx用来进行书籍查询的模块,代码很简单,重定位的那段代码觉得写得很美观:)
4Response.Redirect(( new StringBuilder(PageBase.UrlBase))
5 .Append( " /searchresults.aspx?type= " )
6 .Append(index) 
7.Append( " &fullType= " )
8 .Append(Server.HtmlEncode(SearchDropDownList.Items[index].Text))
9 .Append( " &text= " )
10 .Append(Server.UrlEncode(searchText)).ToString(), false );
11就这么几个字符串连接,都用了一个SringBuilder,还有Server.HtmlEncode(),Server.UrlEncode()方法的调用,减少不必要的麻烦。
127.SearchResult.aspx:查询结果显示页面。因为查询页面不要用到Customer和Order信息,所以页面的EnableSessionState设置为false,
13EnableViewState也设置为flase.
14在Page_Load()事件中取得传入的参数,生成查询结果.有段代码如下:
15 if (IsPostBack)
16 {
17 //
18 // Avoid a refresh problem if the user has left the search
19 // string empty by rerunning last search.
20 //
21 if ( ((TextBox)ModuleSearch.FindControl( " SearchTextBox " )).Text.Trim() != String.Empty )
22 {
23 return ;
24 }
25 }
26 // Other Code
27可不可以直接把Other Code放入if(!IsPostBack){}中来“Avoid a refresh problem”?
288\. CategoriesModule.ascx:分类信息展示模块,因为Categories信息很少变化,把数据库中取得的分类信息保存到Cache中,设置
29失效时间为60分钟之后。
309.AccountModule.ascx:创建或编辑用户账户,创建或编辑的客户保存在Session中,方便快速的获取和更新.
31创建新的客户信息中密码的保存经过了层层加密。
32a.用户的密码与确认密码均一致
33b.通过sha1.ComuteHash计算输入密码的哈希值
34c.得到的哈希值再与利用RNGCryptoServiceProvider生成长度为4的加密随机数合并生成新的字节数组
35d.新的字节数组再计算新的哈希值并
36e.再次加入原加密随机数,从而得到保存于数据库的加密密码。
37登陆时
38a.取得用户电子邮箱哈希值
39b.取得用户保存于数据库中加密密码
40c.取得原后4位随机加密值
41d.像加密时一般,重新与当前用户输入电子邮箱哈希值进行哈希计算
42e.得到的哈希值与保存于数据库中的加密密码一一对比,得到结果
43哈希备注:哈希函数是现代密码系统的基础。这些函数将任意长度的二进制字符串映射为固定长度的小二进制字符串(称为哈希值)。
44加密哈希函数有这样一个属性:在计算时不可能将两个不同的输入通过哈希算法取为相同的值。哈希函数通常用于数字签名和保持数据完整性。
45哈希值用作表示大量数据的固定大小的唯一值。如果相应的数据也匹配,则两个数据集的哈希应该匹配。
46数据的少量更改会在哈希值中产生不可预知的大量更改。
4710.viewSourceModule.ascx:查看源代码的用户控件。与之相关的还有ViewSource.aspx页面和不包含于项目之中的
48Docs文件夹和每个页面或控件对应的扩展名为.src的文件,来实现程序运行时查看本身的实现代码。
49ViewSourceModule用户控件也启用了缓存声明如下:
50 “ ```
51 ... @ OutputCache Duration = " 3600 " VaryByParam = " none " VaryByControl = " BannerModule.PathPrefix "
52``` ”
53**_MSDN帮助_ ** :
541.页面缓存和用户控件缓存
55ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconcachingmultipleversionsofpageorcontroloutput.htm
56ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconcachingmultipleversionsofusercontroloutput.htm
572.PageBase基类和ModuleBase基类均用到了Session,为什么不用Cache?两种有何区别和各自的优势?
58
59**_疑问_ ** :1.查询重定向时用到Server.HtmlEncode()和Server.UrlEncode(),这两者编码方法有何区别?此处是否可以均用UrlEncode()?
602.放到页面展示的内容均进行HtmlEncode()编码。
613.DailyPickModule.ascx中有对应用中EnablePageCache配置的获取
62 if (DuwamishConfiguration.EnablePageCache)
63 {
64 // Enable Page Caching...
65 Response.Cache.SetExpires ( DateTime.Now.AddSeconds(DuwamishConfiguration.PageCacheExpiresInSeconds));
66 Response.Cache.SetCacheability(HttpCacheability.Public);
67 }
68不明白,在BannerModule.ascx,CategoriesModule.ascx有对Cache的操作,在这两个地方为什么不需要进行判断?
69另外,在此设置的Enable或Disable页面Cache信息对BannerModule和CategoriesModule中的Cache操作与设置有没有影响??