<feed version="0.3" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://purl.org/atom/ns#" xml:lang="en-TT"><title>sea</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/default.aspx" /><tagline type="text/html">

大风起兮云飞扬，威加海内归故乡，安得猛士守四方</tagline><id>http://www.kisssunshine.com/blogs/sea/default.aspx</id><author><url>http://www.kisssunshine.com/blogs/sea/default.aspx</url></author><generator url="http://communityserver.org" version="1.1.0.1581">Community Server</generator><modified>2006-07-25T22:48:00Z</modified><entry><title>迪拜手记</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2008/09/13/82820.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:82820</id><created>2008-09-13T04:44:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;迪拜机场7小时，写博留念&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 没想到迪拜机场还能接上电源上网，而且网速还相当之快，比起巴格达已经持续抽疯了一个月的网络速度来说，这大概是飞机和动车组的速度对比一样。&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; 时间：&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; 6点起床，洗刷，收拾。&lt;BR&gt;&amp;nbsp; 7点司机准点到，出发。&lt;BR&gt;&amp;nbsp; 7点到8点：过五关斩六将。&lt;BR&gt;&amp;nbsp; 斩六将是假的，过5关是真的。&lt;BR&gt;&amp;nbsp; 进机场之前，就有3关：&lt;BR&gt;&amp;nbsp; 一次是车停在路上，人下来，行李留在车上，雇佣的非洲黑人大兵牵着吊着呼呼喘气的大狼狗挨个的对着汽车左闻右闻，我坐的车排在最后，那狗还特意溜了一圈，幸亏没叫。&lt;BR&gt;&amp;nbsp; 二次是直接把行李带到一个小木屋里，全部打开，司机问了我放在行李箱里的硬包装盒子里装的是什么，中东阿拉伯人不允许喝酒，我犹豫了一下，还是如实相告：酒。那IP(Iraq Poliece)也没多说什么，给我放行了。&lt;BR&gt;&amp;nbsp; 平心而论，伊拉克人对中国人还是不错的，司机一路上跟关卡的哨兵打招呼，直接扔一个词：China。基本上就不会截停。中间有个IP过来，查了我的护照，跟我哇啦哇啦了一下，没听懂。后来问司机，司机说，IP问我：猪头，知道jacket 陈吗，然后模仿了一下李小龙做动嘴里的发声。&lt;BR&gt;&amp;nbsp; 9点到机场，询问之后，找到了伊拉克航空公司的换登机牌的窗口，居然一个人都没有，一个老头连比带划的告诉我，10点半的飞机取消了，坐在那慢慢等吧，下午2点中才能起飞。&lt;BR&gt;&amp;nbsp; 晕掉，真有下次再来伊拉克，绝对不做这天杀的伊拉克航空公司的航班了，宁愿多出100美元买约旦皇家航空公司的。&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; 左等右等，中间还说要delay到下午6点才起飞了。。。挺崩溃的，后来结果是下午3点就起飞了。&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; 晚上9点到迪拜机场1号，机场很豪华，阿联酋航空的服务也真的挺不错。&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; 人物篇：&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; 1&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; 巴格达机场，11点左右，等待check in。隔了一个空座位，一个把头发用花头巾裹住的阿拉伯女坐在我旁边，身材比较胖，听见他对一个看上去听老实的清洁工说：能不能说英语？麻烦帮忙到里面去帮我买支水？&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; 有点奇怪，为什么不直接用阿拉伯语问呢。于是搭讪。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：请问一下，你也要去迪拜吧？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 花头巾：不，我不去迪拜，我去叙利亚。&lt;BR&gt;&amp;nbsp;&amp;nbsp; ???，过了一会材反应过来：叙利亚？哦。。叙利亚，我知道那个地方。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：那么你呢？是日本人还是中国人？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：中国人。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：干啥的？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：过来这边做技术支持的。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：为什么公司做技术支持？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：比如XXX,XXX这样的公司。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：这些公司给你的报酬好吗？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：不是这样的，我还是为中国的公司工作，只是工作这边做技术支持而已。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 不知道她听懂没有，也没有再问。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：那么你呢？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：我为军队工作，做翻译，不过已经辞职了。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：为军方工作？为美国军队工作？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 花头巾：是的啊，在美国军队和伊拉克警察之间做翻译，已经干了五年了。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我想，那估计也是挺危险的一份工作，不过没问。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：你多大了啊？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：生于1984。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：呵呵，我只比你大一岁，我1983.&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：呵呵，看起来蛮年轻的嘛。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：我看起来很老啦，因为我长得比较胖。&lt;BR&gt;&amp;nbsp;&amp;nbsp; ...还是挺有自知之明的。&lt;BR&gt;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：你什么时候的航班啊?&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：下午2点。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：那时间还蛮长的。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：原来的上午10点半航班取消了，推迟到下午2点，做的伊拉克航空。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 她：伊拉克航空确实是破，所以我基本上不坐他家的飞机。有次做了他家的飞机，在起飞的时候轮胎还破掉了，吓死我了。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：第一次坐，我不知道啊，呵呵，否则我也不买这家公司的票了。&lt;BR&gt;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;&amp;nbsp;&amp;nbsp; 虽她干的也算是叛国的行为，但对她印象挺不错，感觉挺开朗热情的一个女孩，要不是她赶飞机，还想继续聊。&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; 2&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; 迪拜机场，刚下飞机，比较兴奋，跑过去passport control,排队大半天，结果说眼睛测试还没做呢。。。于是回过头来重新排另外一支老长的队做眼睛打印，幸好这次比较顺利，坐下来2分钟就给我把章盖了。&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; 前面排着一个个子比我还瘦的亚洲人，看他穿的安踏，想是中国人吧，比较亲切，于是问：请问你是中国人吧？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 他回过头来：是啊。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：你是哪个地方的？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 他：福建的，你呢？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：广东的。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 他用粤语：你好你好。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：你从哪儿过来迪拜的？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 他：从伊朗，过来飞签的。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：看你像个学生啊，毕业了还是已经工作了？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 他：我毕业三个月了。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：你是那个公司的啊？是不是中兴华为的？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 他：他是XXX的。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：啥？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 他：XXX的。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我没听懂，问：做哪行的？&lt;BR&gt;&amp;nbsp;&amp;nbsp; 他：建筑的。&lt;BR&gt;&amp;nbsp;&amp;nbsp; 我：噢.......&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=82820" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=82820</wfw:commentRss></entry><entry><title>一天（二）</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2008/06/14/64407.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:64407</id><created>2008-06-14T15:49:00Z</created><content type="text/html" mode="escaped">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;本来定的7：40闹钟，继续迷糊了一会，惊醒，8：14分了，于是起床，把电脑开了，去洗漱。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;洗漱回来，登录进系统，打开邮箱收邮件，便下楼去吃早饭，很典型的，满三调羹的奶粉冲半碗温水加半碗凉的纯净水，抓起一个面包就着牛奶吃下去，吃完面包吃鸡蛋，早饭就这么对付过去了。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8：50的样子，收拾收拾，把电脑抬到楼下办公室，准备出发。大家有事的都会磨蹭磨蹭，大概9点多的样子才都收拾好，5个人背着包挤一辆小汽车，瘦长的身材也不是完全没好处的。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5分钟的样子后，就到了机房，确认发电机已开，确认电源没问题，确认可以上电，于是才放心的给设备上电，瞬间机房便充满设备愉快的吼声。铺开笔记本，连上局域网，便开始调试。一个问题确实搞不定，于是跟一个叫Noori的本地员工请教了一下。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这个叫Noori的家伙，是个很帅的胖子，头发疏的一丝不苟，曾到过深圳，上海，南京接受培训，在南京呆了40天，到过的南京景点比在南京呆了4年的我去过的还多。在南京，每天一下班，就跟另一个叫lavey的大胖子，也是这边的本地员工，从公司步行出去游荡，每天步行到一个地方，比如说沃尔玛，然后打车回来，第二天再打车到沃尔玛，继续开始步行。Noori除了胖之外，还非常的聪明，据说以前是大学教师，现在是办事处里技术最强的本地员工了，最佩服他的地方还不在于他的技术有多强，他描述问题之清晰实在让人惊叹,思路清晰，画的图清晰，语言上的表达也非常的清晰。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我问Noori在他到过的中国城市中，他最喜欢哪个城市，Noori非常肯定的回答：南京。因为南京非常自然化，南京有很多很多的树。这引起了我的共鸣，我也非常喜欢南京的树。曾在大学里听过一个叫毕飞宇的作家的讲座，毕飞宇说，曾有朋友劝他搬到北京去，他不搬，因为他喜欢这样的感觉，从南京马路的一端朝前看过去，是长长的由大树搭成的树洞。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Noori和别人聊天的时候，我在旁边听着，了解到一些关于政治的东西。伊拉克有很多人不喜欢萨达姆，因为老萨非常的残忍，Noori举了个例子，比如给局方定了两周内空调一定要到位，如果局方两周内没搞定，那么就会被老萨投入监狱，然后再过一段时间就会人间蒸发了。但是，萨达姆能控制这个国家。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;对于美国政府，刚开始的时候，有很多伊拉克人是欢迎他们的到来的，但过了几年之后，便开始感到了失望，美国人并没给伊拉克人带来什么好处。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;扯远了，其实工作上的事情，细节方面也没什么好说的，算是为增加篇幅吧。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;一般是在中午，发电机会停上一个小时，一般也是在这个时候，司机会把饭送过来，我们5个人，躲到一个小房间里，把菜消灭掉，然后我来收拾--今天正好轮到我。如果吃完饭还有时间，那么就是随便聊天，听听音乐，有兴致的就跟着哼哼。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;电来了，我们继续工作，一个下午就这么过去了。司机会在4点多的样子过来等我们，我们会继续磨蹭，关设备，下电什么的比较慢，遇到点别的事还会拖到5点多，司机的脸色有点难看，明显的不爽，我们只能不停的说sorry啦。问了下司机今天怎么没带那副很酷的墨镜，司机说，他的墨镜放在椅子上，被一本地员工的大屁股压了个稀巴烂。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;回到办事处，5点到6点这段的时间刚好是油机休息停电的时候。有兴致的在昏暗中玩两把桌上足球，或者打开电脑继续干活，就这么到了7点，开饭的时间，厨房里的饭桌上气氛有时有点压抑，于是把碗抱到电视房里，一边吃饭一边看欧洲杯好了。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;晚饭后，有兴趣的，再玩几把桌上足球，当然，洗澡得趁早，说不定会没水，累了一天的臭汗不冲掉，很难受的。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;接下来，到11点多的这段时间，写写日报，周报，月报，把白天遇到的问题反馈给家里，有时间就看上一两集friends。Zzzzz....&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=64407" width="1" height="1"&gt;</content><slash:comments>2</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=64407</wfw:commentRss></entry><entry><title>星期五</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2008/04/19/63115.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:63115</id><created>2008-04-19T14:32:00Z</created><content type="text/html" mode="escaped">从13号出发，到现在17号，&lt;br&gt;  &lt;br&gt;  13号晚上11：30上海到迪拜。&lt;br&gt;  &lt;br&gt;  地铁。&lt;br&gt;  &lt;br&gt;  动车。吃饭。&lt;br&gt;    和同去的一个同事在车上一路很兴奋的聊着关于工作的种种，基本上不忌讳什么敏感的话题了。结果在下车的时候，一个哥们拖着行李搭&lt;br&gt;&lt;br&gt;讪：你是中兴的吧，我也是中兴的。他说他去哥伦比亚的，去巴黎转机。于是我们一起吃饭，交谈得知，他是98年就来了中兴通讯工作，算起&lt;br&gt;&lt;br&gt;来已经工作十年了。我们听了差点没把舌头掉下来，猜想他肯定是一位老大，这哥们的口气一上来就都是问我们公司的三层领导谁谁在管我们&lt;br&gt;&lt;br&gt;，那个汗啊，搞不好还是个区总什么的，打小就跟我们公司的三层领导一块玩泥巴长大的。想起了刘德华在《投名状》里说的台词：你在军中&lt;br&gt;&lt;br&gt;肯定是个头吧?由于我们在火车上聊了不少敏感话题，要是这位区总回去向我们领导参我们一本，估计就吃不了兜着走了。&lt;br&gt;    去到浦东机场后，我们就分开了。&lt;br&gt;    &lt;br&gt;   机场，安检，过海关，登机。&lt;br&gt;   在机场等了好久，上海的一位也去伊拉克的同事终于赶了过来和我们汇合。在此真得感谢小朱和鬼两位的送行。安检的时候也挺顺利。进去&lt;br&gt;&lt;br&gt;的时候看见一位警察叔叔拉着一位乘客在谈话，凑过去听了一下：大概的意思是这哥们要去的国家还没和中国建交，因此就不打算放行了。&lt;br&gt;   波音777的大飞机就是爽，空姐啊，吃的玩的，以前坐的小飞机在这些方面是没办法比的，就是9个小时的旅程比较漫长。在点菜的时候，也&lt;br&gt;&lt;br&gt;深感到了英语的重要性，只点了自己能读出来的菜单和饮料，郁闷，被旁边一位去英国的家伙鄙视了。&lt;br&gt; &lt;br&gt; &lt;br&gt;   迪拜，安检，过海关。&lt;br&gt;   迪拜的机场果然大，在里面晃了好久才晃到要去行李的地方，这之前碰到了一点麻烦。就是有一道关卡要录瞳孔，之前我不知道这是干什么&lt;br&gt;&lt;br&gt;用的，和我一起过去的两位同事验的时候非常顺利，就我反反复复的拖了比较长的时间。可能是因为眼睛太小的原因吧，阿拉伯人不停的让我&lt;br&gt;&lt;br&gt;转头看灯光，我非常困惑，怀疑自己听错了，为什么要这样傻布拉矶的。后来才知道，应该是为了刺激瞳孔放大。&lt;br&gt;   &lt;br&gt;   在迪拜逗留。&lt;br&gt;   我们14号凌晨4点半就下了飞机，但由于订的是14号到15号的酒店，所以下了飞机后，我们就没地方去了，在机场里呆到天亮后，打的来到&lt;br&gt;&lt;br&gt;酒店，把行李寄存好，就出去晃悠，找大商场，找麦当劳肯德基，结果在路上走了一个多小时，愣是没找着(第二天才知道我们要找的店就在酒&lt;br&gt;&lt;br&gt;店后面...)，只能饥肠辘辘的又回到了酒店大堂坐着等check in。酒店的服务生非常热情，提行李啊什么的，我们都觉得不给小费似乎很不好&lt;br&gt;&lt;br&gt;意思。结果还是很不好意思的没掏小费。&lt;br&gt;   最终酒店前台的老板娘(?)看我们就这么待在大堂里不是个办法，等我们订的房间的客人一check out出来之后就让我们入住。于是得以在12&lt;br&gt;&lt;br&gt;点左右就提前入住了。接下来到楼下随便买点吃的对付对付，等旅行社把机票和发票过来之后，就昏睡了过去。&lt;br&gt;   晚上8点醒了，吃了点东西填饱肚子继续睡。&lt;br&gt;   从酒店的窗户看过去，觉得迪拜也不咋的，超过10层的建筑很少很少，也没找到传说中那个7星级的酒店，呵呵。&lt;br&gt;   &lt;br&gt;   从迪拜到erbill&lt;br&gt;   &lt;br&gt;    第二天早早的，凌晨4点半就醒了，继续强迫自己睡到7点多，没来得及吃早饭便跟同事下楼打车去机场。酒店前貌似有黑车可以坐的，到&lt;br&gt;&lt;br&gt;机场一口价30迪拉姆合60元人民币，由于考虑到这种车不能打印发票供我们以后报销，于是就去路边等taxi，结果等了大半天就是没等到，于&lt;br&gt;&lt;br&gt;是只能灰溜溜的再回头找黑车，想不到司机居然坐地起价，50迪拉姆!真要吐血了。只能我们自己掏钱。&lt;br&gt;    到了机场，在安检的时候我再次碰到了点麻烦，不知道是腰带，还是鞋上的金属触发了警报，我试了几次都 不能通过，最后稀里糊涂的警&lt;br&gt;&lt;br&gt;察叔叔也就给放行了。&lt;br&gt;    在迪拜的机场碰到了几位去去erbill的中国人，一位是华为的兄弟，两位是长城井钻的工人，还有一位是中石油的牛人。我想在伊拉克的&lt;br&gt;&lt;br&gt;中国人基本上也大都属于以上这几个公司的，八九不离十,机场里的相遇的几位也算是中国人在伊拉克谋生的缩影吧。当然，还差开饭馆的，这&lt;br&gt;&lt;br&gt;个倒是在erbill的移民局碰到了一位自称开中餐馆的老板娘，浓妆抹艳的。后来听带我们去办签证的办事处的同事说，这老板娘其实就是个皮&lt;br&gt;&lt;br&gt;条客，专骗中国的女孩过来这边做皮肉生意的。想起还跟她握过手的，不由的感觉有点恶心。&lt;br&gt;    &lt;br&gt;    我们的运气不错，迪拜到erbill的航班在晚点一个小时后"非正常的"起飞了，这小航空公司的航班正常情况下都会晚点7，8个小时才起飞&lt;br&gt;&lt;br&gt;，要是看着上客率少，算下成本发现亏了也很可能干脆取消了这次航班。&lt;br&gt;    &lt;br&gt;    到了erbill这边之后，感觉这边的办事处条件还是不错的，租的是一个大概有300平米的带小院子的别墅式的民房，设施也很齐全。短期内&lt;br&gt;&lt;br&gt;在这边住的话日子估计还是可以过的很滋润的，长期常驻可能会有点无聊,总而言之，这儿什么都不缺，就是缺中国的女人 。&lt;br&gt;    &lt;br&gt;    erbill办理签证。&lt;br&gt;    &lt;br&gt;    伊拉克办理签证贼变态,由于我没带照片，所以只能先到照相馆把照片拍了。在路上，看着陌生的环境，我也得承认，如果让我独自一个人&lt;br&gt;&lt;br&gt;从上海过来的话，不一定能应付的了这么漫长的旅程和关卡。 &lt;br&gt;    带我去拍照片的同事H在erbill呆了一年。H开着车在街上晃悠，看到漂亮的美女就停下车过去问路，顺便说一下，在erbill侨居的外国人&lt;br&gt;&lt;br&gt;挺多的，特别是德国人。结果还真给他问到了。拍了照片回来的时候，H看到一个漂亮的欧洲女人，就凑过去摇开车窗问：where is the new &lt;br&gt;&lt;br&gt;city?也就是我们住的那个地方，欧洲女人很干脆的说：no。把那哥们郁闷的。&lt;br&gt;    Erbill的移民局其实就是一个小屋子，在那边排着队大概不是一个很愉快的经历。在臭臭的伊拉克人里排队一站就是半天，而那些欧洲人&lt;br&gt;&lt;br&gt;就不用排队，直接优先，且不说其中一个小孩在半个小时的等待中用好奇的了，目光盯着我足足看了半小时，看得心里那个直发毛啊。除非冒&lt;br&gt;&lt;br&gt;充一下同样脸孔肤色的韩国人和日本人，我们不屑于冒充日本人，于是偶尔就会冒充下韩国人。H对此评价道：伊拉克人真贱，谁侵略了他们，&lt;br&gt;&lt;br&gt;谁就受到他们的优待，要是当初中国也随便拉两个兵过来就好了。当然，“他们”应该指的是现在的伊拉克政府吧。H说，凡是带兵来过伊拉克&lt;br&gt;&lt;br&gt;的国家的公民来到伊拉克，都受到了VIP优待，而中国人就没这么好运气，到哪都得排队。&lt;br&gt;    &lt;br&gt;    house以及house里的人。&lt;br&gt;    house占地大概有300平米吧，两层的小别墅，8，9个房间的样子，4个bathroom,配套设施也很全，跑步机，桌上足球，乒乓球台，哑铃，&lt;br&gt;&lt;br&gt;电视，烧烤台，等等等等。目前还是不错的，就是不知道有多少的困难和危险在巴格达等待我们。&lt;br&gt;    一名国代，一名应该是客户经理，一名商务经理在前台去约旦出差跟H公司火拼去了，一名管中东三个国家的财务，一名house管家，以及&lt;br&gt;&lt;br&gt;和我一起新过来的两位同事。&lt;br&gt;    今天house对门的一户人家似乎出了人命，从窗户看到从公交车上抬下一个人来，撕心裂肺的哭声，汽车的声音，警察，围观的人群等闹了&lt;br&gt;&lt;br&gt;半天，到晚上终于平息了下来。事故的原因也还不清楚，我们有点担心是因为恐怖事件，这样因为住的近很有可能会殃及我们。&lt;br&gt;    &lt;br&gt;    事件发生之后，我第一次打了电话回家，当然不敢跟家里提这个事。老爸听到我的声音，就一直结结巴巴的，老爸平时虽然也会有口吃的&lt;br&gt;&lt;br&gt;毛病，但绝不像这次通话，每句话都没能顺利的说出来。我有点后悔了，让家里人这么的担心，实是很不应该。&lt;br&gt;    &lt;br&gt;    天平的一头，是XXX$/天，另一头则是价值无穷大的宝贵生命乘以一个在0.1%到0.01%的系数。精明的人大概都能算出自己应该倾向天平的&lt;br&gt;&lt;br&gt;那一边。&lt;br&gt;    &lt;br&gt;    出发巴格达。&lt;br&gt;    今天刚买了明天去巴格达的机票，却听说巴格达那边起了沙尘暴，巴格达那边要走的人没走成，没了空床位，我们三个里只能按计划出发&lt;br&gt;&lt;br&gt;一个同事，其余的两个包括我在内只能按兵不动了。&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=63115" width="1" height="1"&gt;</content><slash:comments>14</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=63115</wfw:commentRss></entry><entry><title> 祝大家新年快乐</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2007/02/17/10109.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:10109</id><created>2007-02-17T05:01:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;偷偷的冒个泡祝大家新年快乐:&lt;/P&gt;
&lt;P&gt;工作的祝步步高升,&lt;/P&gt;
&lt;P&gt;考试的祝考试顺利,&lt;/P&gt;
&lt;P&gt;求职的祝offer就手,&lt;/P&gt;
&lt;P&gt;没钱的祝恭喜发财!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=10109" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=10109</wfw:commentRss></entry><entry><title>Web2.0编程思想：16条法则 </title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2006/12/28/9462.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:9462</id><created>2006-12-28T14:28:00Z</created><content type="text/html" mode="escaped">1、在你开始之前，先定一个简单的目标。无论你是一个Web 2.0应用的创建者还是用户，请清晰的构思你的目标。就像“我需要保存一个书签”或者“我准备帮助人们创建可编辑的、共享的页面”这样的目标，让你保持最基础的需求。很多Web 2.0应用的最初吸引之处就是它的简单，避免并隐藏了那些多余的复杂性。站在创建者的立场，可以想象Google的几乎没有内容的主页，还有del.icio.us的简单的线条。从最终用户的角度来看，与之齐名的就是Diggdot.us所提供的初始化页面。你能够并且希望加入更多功能，但是先做好最开始的。在一个时候只做一个特性，完成一个目标。这听起来很太过于单纯化了，但它将使你更加专注，而且你也会明白我的意思。
&lt;P&gt;2、链接是最基础的思想。这就是我们称之为Web的一个理由。链接是把Web中各种实体连接起来的最基本的元素。你的信息、你的关系、你的导航，甚至是能够被写成URL的任何内容。这里有一个链接应该遵循的规则（其实你也不必严格的遵守）：&lt;/P&gt;
&lt;P&gt;1) Web上的任何东西都是可以被URI或者是URL所连接的。&lt;BR&gt;2) 把所有的链接都保存为他的原始出处，这样可以让你与任何人、在任何地方、任何时候都能分享它。&lt;BR&gt;3) 第二条中任何时候的前提是链接必须是持久的，它不会在没有任何缘由的情况下被改变或者是消失。&lt;BR&gt;4) 链接应该是人类可读的、稳定的、并且能够自我诠释的。&lt;/P&gt;
&lt;P&gt;3、数据应该属于创建它的人。是的，你听我的。任何用户创建的、贡献的或分享的都是他们自己的，除非他们很明显的放弃这个权力来让你自由处置。他们贡献到Web上的任何信息都应该是可编辑的、能被删除的、并且能够取消共享，无论在任何时候，只要用户愿意。这也包含了那些间接的数据，像他们所关心的记录、日志、浏览历史、网站访问信息，或者是任何可以被跟踪的信息。所有的网站必须清晰简单的陈诉那些信息是用户创建的，并且提供他们停止创建的方法，甚至是清除的方法。&lt;/P&gt;
&lt;P&gt;4、数据优先，体验与功能其次。无论它是文本、图片、音频还是视频，Web最终还是把这些解析为数据。换句话说，你无法脱离数据去呈现内容。所有这些数据都通过那些易于发现的URL来定位（参见第2条）。通过另一种形式来看待这些，Web最终是名词优先，动词其次，虽然最近正在向动词偏移。来看看名词的例子：日历的条目、家庭照片、股票价格。还有一些动词的例子：定一个约会、共享一张图片、买一份股票。&lt;/P&gt;
&lt;P&gt;5、做好积极分享一切的准备。尽可能的分享一切，你所拥有的所有数据，你所提供的所有服务。鼓励不遵循原有意图的使用，提倡贡献，不要那些需要分享的内容坚持设置为私有的。在分享与发现之后，提供易于使用的浏览方式是显而易见的需求。为什么呢：话说回来，你会从别人的共享之中受益匪浅。注意：这里没有许可让你去侵犯版权保护的法律，你不能够去分享你刻录的DVD或者是拥有商业版权音乐，因为你已经同意不会去分享这些东西。但是你可以发现并分享那些完全开放的媒体内容。一个小小的建议，你可以学习一下Creative Commons license（共创协议）.&lt;/P&gt;
&lt;P&gt;6、Web是一个平台；要让它成长。当然，我们还有很多其他的平台（Windows、Linux、Mac），但是那些已经不是重点了。换句话说，Web是无法脱离的平台，不会中断的平台，你可以通过各种方式去扩展的平台。你在Web上提供的数据与服务将会成为Web一部分，最终你会在Web平台的某一处扮演你的角色。扮演好你的角色并照顾好后来者。&lt;/P&gt;
&lt;P&gt;7、理解与信奉“阶梯性”。现在的Web越来越大，几乎蔓延到了全世界的所有国家，并且已经拥有了10亿用户。我的观点是Web的各个组成部分存在着细微的区别和不同，就像不同地方的用户那样。例如Web的设计部分：易用性永远优先于速度、可靠性、重用性与可集成性。你也应该提供同样的体验给你的用户。它已经被一次又一次的被人们在文档中强调，忠诚的用户很快会成为专业的用户，他们期待更快的速度还有更多。退一步支持他们。同样，也有很多很多的用户会进入这个阶梯的底端，如你所期待的那样。他们可能不会说你的语言，不熟悉你的文化，甚至不知道是如何到这里的。所以你需要向他们表达清楚。&lt;/P&gt;
&lt;P&gt;8、任何东西都是可编辑的。或者是它应该被编织的更好。要确定的是，只有很少的东西是不能被编辑的，剩下的都可以，这是一个可写的Web。这并不意味着原始内容的丢失，而通常被理解为用户能够很容易的对内容加以评论，或者评注内容是在那里发现的。如果你对此应用的好，他们能够比你所想象的做的更多（把内容串起来并且给予原始内容来创建自己的，等等）。&lt;/P&gt;
&lt;P&gt;9、Web上的身份是神圣的。不幸的是，这并不意味着你能够得到更多的隐私（这完全是上个世纪的想法）。但对身份的验证是必要的，你应该感谢那些只需一个邮件地址就能确定你身份的服务。这意味只要你对你的用户承诺了，你就必须保证他们的隐私安全。必要的时候，在这个世界的某处你还得为你的用户挺身而出，向当地的权威挑战。如果你没有打算那样做，你就得把实际情况告诉你的用户。另一方面，如果身份是必须的，不要试图伪装它，不然在某一天我们将会在Web上放弃我们的最后一点点隐私的权利。&lt;/P&gt;
&lt;P&gt;10、了解流行的标准并且使用他们。从一个消费者或者是创作者的立场来看，数据将会以不同的格式与任何一个人交换。同时这样的数据也会反过来促进标准的完善与采纳。这通常意味像RSS、 OPML、XHTML、Simple XML、JSON等简单标准的流行，而避免SOAP、XSD，还有RDF、ATOM也一样，使用它们会给我的内心带来痛苦。请你也为你所钟爱的标准投上一票来支持它们。&lt;/P&gt;
&lt;P&gt;11、遵循无意使用的规律。如果你把非常有趣的数据和服务用广泛使用的格式开放和共享出去，你将会得到你所应得的，其他人也将会基于你的那一块Web平台来构建。或许还会从别人那里得到更多，所以为这个做一下准备比较好。我已记不清有多少次我看到一个播客（podcasting）服务因为流行过渡而导致服务垮掉，就是因为他们被 Slashdot和del.icio.us给收录了。这一点要知道：网络上的大量化意味着如果一个内容非常有趣，即使是一个很小的角落也会得到惊人的访问量。鼓励使用这种方式，它还是非常有价值的，前提是你要有所准备。&lt;/P&gt;
&lt;P&gt;12、粒化你的数据与服务。我们应该在很早以前就明白这些，大规模集成的数据仅仅适用于无需管理的下载与批量操作。分解你的数据，让他们独立成可描述的URL地址，对你的服务也一样。反过来说，你不要创建一些巨大的、复杂的、像圣诞树那样的数据结构和服务。保持简单，要非常的简单。让这些分离的片断能够容易的被重组和发现。&lt;/P&gt;
&lt;P&gt;13、提供用户能够单独受益的数据和服务。渐渐依赖于这种社会化参与是存在风险的，你需要让你的用户有一点点动机来贡献时间、热情和信息，除非他们能够直接受益。社会化分享比个体行为的利益大很多，除非你能够激发用户的个人动机，否这你将无法享受这份厚礼。&lt;/P&gt;
&lt;P&gt;14、让用户组织并过滤信息。不一定是必须的，但却是非常重要的。让用户以他们自己的方式来标注和组织数据，因为你自己是永远无法及时的处理他们的。用户会按照他们自己理解的最佳方式来处理并构建。要保证你的Web服务能够按照用户所需所想的方式来工作。这也是标签（tagging）和通俗分类（folksonomies ）的方式如此成功的主要因素。&lt;/P&gt;
&lt;P&gt;15、提供丰富的用户体验。Web一直都在和本地的应用程序进行着激烈的竞争。为什么？因为本地程序还是感觉上好一些，速度也快一些。但是这不会长久的（确信在5年或者15年后，这种竞争就不存在了）。是的，我在谈论Rich Internet Applications, Ajax, 还有那些不可思议的交互应用。他们让Web成为了一个真正的“无平台”的平台，如果你知道我是怎么想的。&lt;/P&gt;
&lt;P&gt;16、信奉并支持快速改进和反馈。这个通常意味着加快步伐，但也意味着使用轻量级的工具、技术和不要做出那些适得其反的痛苦决定（例如使用一个被层层环绕的Ajax框架来代替可以通过混合来实现的，或者用C++来构建所有的东西，其实使用Ruby会更好一些）。这同时也意味着需要一个非常快速的方式来处理错误报告，修复Bug，释放新版本。从一个用户的角度来看，报告你所发现的任何问题，还有那些你经常抱怨的地方，甚至那些都不是一个Bug。&lt;/P&gt;
&lt;P&gt;当然，Web 2.0是一个极其广泛和深奥的话题，没有一个人能够列举出它的所有重点和特征。如果你对此充满了兴趣，请花一点时间来补充我没有提到的地方。我想这就是Web 2.0的参与性吧！&lt;/P&gt;&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=9462" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=9462</wfw:commentRss></entry><entry><title>MVP? Looks like Yao, now</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2006/12/15/9402.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:9402</id><created>2006-12-15T12:35:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;ESPN网站首页上的，比较显眼，先转过来&lt;/P&gt;
&lt;P&gt;Biggest man, biggest honors&lt;/P&gt;
&lt;P&gt;Coming into the season I never thought the first quarter would be The Year (So Far) of the Big Man. However upon further review, big is in. &lt;/P&gt;
&lt;P&gt;Of course any MVP debate is, well, subjective. My argument here in naming these Big Five is based on impact. Boy, has it been big so far. 
&lt;P&gt;&lt;B&gt;1. Houston Rockets center &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3599"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Yao Ming&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt; (25.5 ppg, 9.2 rpg, 2.0 bpg, 7th overall in Hollinger PER at 26.04, Team record 14-8).&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;He has made the transition from being arguably the most important player in the league -- he's from China, biggest market in the world by anyone's standard -- to the Rockets' best. Yao's still developing which is scary but his impact has developed to the point to warrant MVP contention. &lt;/P&gt;
&lt;P&gt;His true test for the rest of the season may be getting the Rockets into the playoffs. Not the lock you might think -- this team is 9-32 without T-Mac, and he's out indefinitely. Yikes! &lt;/P&gt;
&lt;P&gt;&lt;B&gt;2. Phoenix Suns guard &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3103"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Steve Nash&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt; (20.2 ppg. 11.7 apg, 3.0 rpg, 12th overall in PER at 24.95, Team record 15-6).&lt;/B&gt; 
&lt;P&gt;All he has done the last two-plus seasons is play the point guard position as well as it can be played. He's won it the last two years, his team is in first place in the division and he's having his best season ever statistically. You do the math. 
&lt;P&gt;&lt;B&gt;3. San Antonio Spurs forward &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3173"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Tim Duncan&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt; (21.4 ppg, 10.2 rpg, 1.7 bpg, 2nd overall in PER at 27.15, Team record 17-6).&lt;/B&gt; 
&lt;P&gt;Numbers alone don't do justice for the "best power forward to ever play the game" -- my opinion but shared by many. Nobody in the game dominates both ends the way he does. Plus he's clutch, might also be a little motivated after being ousted Dirk and the Mavs last year. 
&lt;P&gt;&lt;B&gt;4. Utah Jazz forward &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3632"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Carlos Boozer&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt; (22.6 ppg, 12.3 rpg, 0.5 bpg, 5th overall in PER at 26.43, Team record 17-5).&lt;/B&gt; 
&lt;P&gt;He might also be the feel-good story of the year. He doesn't dominate on the defensive end but offers scoring and great knack for always being in the right place at the right time. My question about Booz was, is he really on par with the top power forwards in the game? So far, my answer is a resounding yes. Early on, averaging more points and rebounds than Garnett, Duncan and Brand . . . oh, did I mention the best record in the league? 
&lt;P&gt;&lt;B&gt;5. Orlando Magic center &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3818"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Dwight Howard&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt; 17.5 ppg, 12.6 rpg, 1.8 bpg, 18th overall in PER at 23.11, Team record 15-10). &lt;/B&gt;
&lt;P&gt;The Tim Duncan of the East. While not as polished as the Big Fundamental, becoming every bit as impactful. Quietly he has emerged as arguably the best center in the league! With apologies to the Diesel, for my money Yao and the Baby Beast are a toss up. Did I mention the Magic are the best team in the East? He's only going to get better. 
&lt;P&gt;Yes, &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3118"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Kobe Bryant&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt;, &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3706"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Carmelo Anthony&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt; and &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3708"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Dwyane Wade&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt; would also get serious consideration. 
&lt;P&gt;Kobe's greatness this year has been in his ability to trust his teammates. Carmelo, arguably the best pure scorer in the game, has matured into a better all-around player. Scary when you think just how good he can be. 
&lt;P&gt;D-Wade has been as good as it gets. I know Miami's only 9-12, but my God where would it be without his play? Still the team to beat in the East, especially if &lt;A href="http://sports.espn.go.com/nba/players/profile?statsId=3112"&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Antoine Walker&lt;/FONT&gt;&lt;/U&gt;&lt;/A&gt; decides to show up. &lt;/P&gt;&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=9402" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=9402</wfw:commentRss></entry><entry><title>有效编写软件的75条建议 </title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2006/12/09/9355.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:9355</id><created>2006-12-09T02:43:00Z</created><content type="text/html" mode="escaped">&lt;P&gt;1. 你们的项目组使用源代码管理工具了么？&lt;BR&gt;　　　　应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。&lt;/P&gt;
&lt;P&gt;　　 2. 你们的项目组使用缺陷管理系统了么？&lt;BR&gt;　　　　应该用。ClearQuest太复杂，我的推荐是BugZilla。 &lt;/P&gt;
&lt;P&gt;　　3. 你们的测试组还在用Word写测试用例么？&lt;BR&gt;　　　　不要用Word写测试用例（Test Case）。应该用一个专门的系统，可以是Test Manager，也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。&lt;/P&gt;
&lt;P&gt;　　4. 你们的项目组有没有建立一个门户网站？&lt;BR&gt;　　　　要有一个门户网站，用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现，15分钟就搞定。买不起SPS 2003可以用WSS (Windows Sharepoint Service)。 &lt;/P&gt;
&lt;P&gt;　　5. 你们的项目组用了你能买到最好的工具么？&lt;BR&gt;　　　　应该用尽量好的工具来工作。比如，应该用VS.NET而不是Notepad来写C#。用Notepad写程序多半只是一种炫耀。但也要考虑到经费，所以说是“你能买到最好的”。 &lt;/P&gt;
&lt;P&gt;　　6. 你们的程序员工作在安静的环境里么？&lt;BR&gt;　　　　需要安静环境。这点极端重要，而且要保证每个人的空间大于一定面积。 &lt;/P&gt;
&lt;P&gt;　　7. 你们的员工每个人都有一部电话么？&lt;BR&gt;　　　 需要每人一部电话。而且电话最好是带留言功能的。当然，上这么一套带留言电话系统开销不小。不过至少每人一部电话要有，千万别搞得经常有人站起来喊：“某某某电话”。《人件》里面就强烈谴责这种做法。 &lt;/P&gt;
&lt;P&gt;　　8. 你们每个人都知道出了问题应该找谁么？&lt;BR&gt;　　　　应该知道。任何一个Feature至少都应该有一个Owner，当然，Owner可以继续Dispatch给其他人。&lt;/P&gt;
&lt;P&gt;　　9. 你遇到过有人说“我以为…”么？&lt;BR&gt;　　　　要消灭“我以为”。Never assume anything。 &lt;/P&gt;
&lt;P&gt;　　10. 你们的项目组中所有的人都坐在一起么？&lt;BR&gt;　　　　需要。我反对Virtual Team，也反对Dev在美国、Test在中国这种开发方式。能坐在一起就最好坐在一起，好处多得不得了。 &lt;/P&gt;
&lt;P&gt;　　11. 你们的进度表是否反映最新开发进展情况？ &lt;BR&gt;　　　　应该反映。但是，应该用Baseline的方法来管理进度表：维护一份稳定的Schedule，再维护一份最新更改。Baseline的方法也应该用于其它的Spec。Baseline是变更管理里面的一个重要手段。&lt;/P&gt;
&lt;P&gt;　　12. 你们的工作量是先由每个人自己估算的么？&lt;BR&gt;　　　　应该让每个人自己估算。要从下而上估算工作量，而不是从上往下分派。除非有其他原因，比如政治任务工期固定等。 &lt;/P&gt;
&lt;P&gt;　　13. 你们的开发人员从项目一开始就加班么？&lt;BR&gt;　　　　不要这样。不要一开始就搞疲劳战。从项目一开始就加班，只能说明项目进度不合理。当然，一些对日软件外包必须天天加班，那属于剥削的范畴。 &lt;/P&gt;
&lt;P&gt;　　14. 你们的项目计划中Buffer Time是加在每个小任务后面的么？&lt;BR&gt;　　　　不要。Buffer Time加在每个小任务后面，很容易轻易的就被消耗掉。Buffer Time要整段的加在一个Milestone或者checkpoint前面。 &lt;/P&gt;
&lt;P&gt;　　15. 值得再多花一些时间，从95%做到100%好值得，非常值得。&lt;BR&gt;　　　　尤其当项目后期人困马乏的时候，要坚持。这会给产品带来质的区别。 &lt;/P&gt;
&lt;P&gt;　　16. 登记新缺陷时，是否写清了重现步骤？&lt;BR&gt;　　　　要。这属于Dev和Test之间的沟通手段。面对面沟通需要，详细填写Repro Steps也需要。 &lt;/P&gt;
&lt;P&gt;　　17. 写新代码前会把已知缺陷解决么？&lt;BR&gt;　　　　要。每个人的缺陷不能超过10个或15个，否则必须先解决老的bug才能继续写新代码。 &lt;/P&gt;
&lt;P&gt;　　18. 你们对缺陷的轻重缓急有事先的约定么？&lt;BR&gt;　　　　必须有定义。Severity要分1、2、3，约定好：蓝屏和Data Lost算Sev 1，Function Error算Sev 2，界面上的算Sev 3。但这种约定可以根据产品质量现状适当进行调整。&lt;/P&gt;
&lt;P&gt;　　19. 你们对意见不一的缺陷有三国会议么？&lt;BR&gt;　　　　 必须要有。要有一个明确的决策过程。这类似于CCB (Change Control Board)的概念。 &lt;/P&gt;
&lt;P&gt;　　20. 所有的缺陷都是由登记的人最后关闭的么？ &lt;BR&gt;　　　　Bug应该由Opener关闭。Dev不能私自关闭Bug。 &lt;/P&gt;
&lt;P&gt;　　21. 你们的程序员厌恶修改老的代码么？&lt;BR&gt;　　　　厌恶是正常的。解决方法是组织Code Review，单独留出时间来。XP也是一个方法。&lt;/P&gt;
&lt;P&gt;　　22. 你们项目组有Team Morale Activity么？&lt;BR&gt;　　　　每个月都要搞一次，吃饭、唱歌、Outing、打球、开卡丁车等等，一定要有。不要剩这些钱。 &lt;/P&gt;
&lt;P&gt;　　23. 你们项目组有自己的Logo么？&lt;BR&gt;　　　　要有自己的Logo。至少应该有自己的Codename。 &lt;/P&gt;
&lt;P&gt;　　24. 你们的员工有印有公司Logo的T-Shirt么？&lt;BR&gt;　　　　要有。能增强归属感。当然，T-Shirt要做的好看一些，最好用80支的棉来做。别没穿几次就破破烂烂的。&lt;/P&gt;
&lt;P&gt;　　25. 总经理至少每月参加次项目组会议要的。&lt;BR&gt;　　　　要让team member觉得高层关注这个项目。&lt;/P&gt;
&lt;P&gt;　　26. 你们是给每个Dev开一个分支么？&lt;BR&gt;　　　　反对。Branch的管理以及Merge的工作量太大，而且容易出错。 &lt;/P&gt;
&lt;P&gt;　　27. 有人长期不Check-In代码么？&lt;BR&gt;　　　　不可以。对大部分项目来说，最多两三天就应该Check-In。 &lt;/P&gt;
&lt;P&gt;　　28. 在Check-In代码时都填写注释了么？&lt;BR&gt;　　　　要写的，至少一两句话，比如“解决了Bug No.225”。如果往高处拔，这也算做“配置审计”的一部分。&lt;/P&gt;
&lt;P&gt;　　29. 有没有设定每天Check-In的最后期限？&lt;BR&gt;　　　　要的，要明确Check-In Deadline。否则会Build Break。 &lt;/P&gt;
&lt;P&gt;　　30. 你们能把所有源码一下子编译成安装文件吗？ &lt;BR&gt;　　　　要的。这是每日编译（Daily Build）的基础。而且必须要能够做成自动的。 &lt;/P&gt;
&lt;P&gt;　　31. 你们的项目组做每日编译么？&lt;BR&gt;　　当然要做。有三样东西是软件项目/产品开发必备的：1. bug management; 2. source control; 3. daily build。 &lt;/P&gt;
&lt;P&gt;　　32. 你们公司有没有积累一个项目风险列表？&lt;BR&gt;　　　　要。Risk Inventory。否则，下个项目开始的时候，又只能拍脑袋分析Risk了。&lt;/P&gt;
&lt;P&gt;　　33. 设计越简单越好越简单越好。&lt;BR&gt;　　　　设计时候多一句话，将来可能就带来无穷无尽的烦恼。应该从一开始就勇敢的砍。这叫scope management。 &lt;/P&gt;
&lt;P&gt;　　34. 尽量利用现有的产品、技术、代码千万别什么东西都自己Coding。BizTalk和Sharepoint就是最好的例子，有这两个作为基础，可以把起点提高很多。或者可以尽量多用现成的Control之类的。或者尽量用XML，而不是自己去Parse一个文本文件；尽量用RegExp，而不是自己从头操作字符串，等等等等。这就是“软件复用”的体现。&lt;/P&gt;
&lt;P&gt;　　35. 你们会隔一段时间就停下来夯实代码么？&lt;BR&gt;　　　　要。最好一个月左右一次。传言去年年初Windows组在Stevb的命令下停过一个月增强安全。Btw，“夯”这个字念“hang”，第一声。 &lt;/P&gt;
&lt;P&gt;　　36. 你们的项目组每个人都写Daily Report么？&lt;BR&gt;　　　　要写。五分钟就够了，写10句话左右，告诉自己小组的人今天我干了什么。一则为了沟通，二则鞭策自己（要是游手好闲一天，自己都会不好意思写的）。&lt;/P&gt;
&lt;P&gt;　　 37. 你们的项目经理会发出Weekly Report么？&lt;BR&gt;　　　　　要。也是为了沟通。内容包括目前进度，可能的风险，质量状况，各种工作的进展等。&lt;/P&gt;
&lt;P&gt;　　 38. 你们项目组是否至少每周全体开会一次？&lt;BR&gt;　　　　　要。一定要开会。程序员讨厌开会，但每个礼拜开会时间加起来至少应该有4小时。包括team meeting, spec review meeting, bug triage meeting。千万别大家闷头写code。 &lt;/P&gt;
&lt;P&gt;　　39. 你们项目组的会议、讨论都有记录么？&lt;BR&gt;　　　　会前发meeting request和agenda，会中有人负责主持和记录，会后有人负责发meeting minutes，这都是effective meeting的要点。而且，每个会议都要形成agreements和action items。&lt;/P&gt;
&lt;P&gt;　　 40. 其他部门知道你们项目组在干什么么？&lt;BR&gt;　　　　要发一些Newsflash给整个大组织。Show your team’s value。否则，当你坐在电梯里面，其他部门的人问：“你们在干嘛”，你回答“ABC项目”的时候，别人全然不知，那种感觉不太好。&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;41. 通过Email进行所有正式沟通 &lt;BR&gt;　　　　Email的好处是免得抵赖。但也要避免矫枉过正，最好的方法是先用电话和当面说，然后Email来确认。 &lt;/P&gt;
&lt;P&gt;　　42. 为项目组建立多个Mailing Group &lt;BR&gt;　　　　如果在AD+Exchange里面，就建Distribution List。比如，我会建ABC Project Core Team，ABC Project Dev Team，ABC Project All Testers，ABC Project Extended Team等等。这样发起Email来方便，而且能让该收到email的人都收到、不该收到不被骚扰。 &lt;/P&gt;
&lt;P&gt;　　43. 每个人都知道哪里可以找到全部的文档么？&lt;BR&gt;　　　　应该每个人都知道。这叫做知识管理（Knowledge Management）。最方便的就是把文档放在一个集中的File Share，更好的方法是用Sharepoint。 &lt;/P&gt;
&lt;P&gt;　　44. 你做决定、做变化时，告诉大家原因了么？&lt;BR&gt;　　　　要告诉大家原因。Empower team member的手段之一是提供足够的information，这是MSF一开篇的几个原则之一。的确如此，tell me why是人之常情，tell me why了才能有understanding。中国人做事喜欢搞限制，限制信息，似乎能够看到某一份文件的人就是有身份的人。大错特错。权威、权力，不在于是不是能access information/data，而在于是不是掌握资源。 &lt;/P&gt;
&lt;P&gt;　　45. Stay agile and expect change 要这样。&lt;BR&gt;　　　　需求一定会变的，已经写好的代码一定会被要求修改的。做好心理准备，对change不要抗拒，而是expect change。 &lt;/P&gt;
&lt;P&gt;　　46. 你们有没有专职的软件测试人员？&lt;BR&gt;　　　　要有专职测试。如果人手不够，可以peer test，交换了测试。千万别自己测试自己的。 &lt;/P&gt;
&lt;P&gt;　　47. 你们的测试有一份总的计划来规定做什么和怎么做么？&lt;BR&gt;　　　　 这就是Test Plan。要不要做性能测试？要不要做Usability测试？什么时候开始测试性能？测试通过的标准是什么？用什么手段，自动的还是手动的？这些问题需要用Test Plan来回答。&lt;/P&gt;
&lt;P&gt;　　 48. 你是先写Test Case然后再测试的么？&lt;BR&gt;　　　　应该如此。应该先设计再编程、先test case再测试。当然，事情是灵活的。我有时候在做第一遍测试的同时补上test case。至于先test case再开发，我不喜欢，因为不习惯，太麻烦，至于别人推荐，那试试看也无妨。 &lt;/P&gt;
&lt;P&gt;　　49. 你是否会为各种输入组合创建测试用例？&lt;BR&gt;　　　　不要，不要搞边界条件组合。当心组合爆炸。有很多test case工具能够自动生成各种边界条件的组合——但要想清楚，你是否有时间去运行那么多test case。 &lt;/P&gt;
&lt;P&gt;　　50. 你们的程序员能看到测试用例么？&lt;BR&gt;　　　　要。让Dev看到Test Case吧。我们都是为了同一个目的走到一起来的：提高质量。&lt;/P&gt;
&lt;P&gt;　　 51. 你们是否随便抓一些人来做易用性测试？ &lt;BR&gt;　　　　要这么做。自己看自己写的程序界面，怎么看都是顺眼的。这叫做审美疲劳——臭的看久了也就不臭了，不方便的永久了也就习惯了。 &lt;BR&gt;　　52. 你对自动测试的期望正确么？&lt;BR&gt;　　　　别期望太高。依我看，除了性能测试以外，还是暂时先忘掉“自动测试”吧，忘掉WinRunner和LoadRunner吧。对于国内的软件测试的现状来说，只能“矫枉必须过正”了。&lt;/P&gt;
&lt;P&gt;　　53. 你们的性能测试是等所有功能都开发完才做的么？&lt;BR&gt;　　　　不能这样。性能测试不能被归到所谓的“系统测试”阶段。早测早改正，早死早升天。&lt;/P&gt;
&lt;P&gt;　　54. 你注意到测试中的杀虫剂效应了么？&lt;BR&gt;　　　　虫子有抗药性，Bug也有。发现的新Bug越来越少是正常的。这时候，最好大家交换一下测试的area，或者用用看其他工具和手法，就又会发现一些新bug了。&lt;/P&gt;
&lt;P&gt;　　 55. 你们项目组中有人能说出产品的当前整体质量情况么？&lt;BR&gt;　　　　要有。当老板问起这个产品目前质量如何，Test Lead/Manager应该负责回答。 &lt;/P&gt;
&lt;P&gt;　　56. 你们有单元测试么？&lt;BR&gt;　　　　单元测试要有的。不过没有单元测试也不是不可以，我做过没有单元测试的项目，也做成功了——可能是侥幸，可能是大家都是熟手的关系。还是那句话，软件工程是非常实践、非常工程、非常灵活的一套方法，某些方法在某些情况下会比另一些方法好，反之亦然。 &lt;/P&gt;
&lt;P&gt;　　57. 你们的程序员是写完代码就扔过墙的么？&lt;BR&gt;　　　　大忌。写好一块程序以后，即便不做单元测试，也应该自己先跑一跑。虽然有了专门的测试人员，做开发的人也不可以一点测试都不做。微软还有Test Release Document的说法，程序太烂的话，测试有权踢回去。&lt;/P&gt;
&lt;P&gt;　　 58. 你们的程序中所有的函数都有输入检查么？&lt;BR&gt;　　　　不要。虽然说做输入检查是write secure code的要点，但不要做太多的输入检查，有些内部函数之间的参数传递就不必检查输入了，省点功夫。同样的道理，未必要给所有的函数都写注释。写一部分主要的就够了。&lt;/P&gt;
&lt;P&gt;　　 59. 产品有统一的错误处理机制和报错界面么？&lt;BR&gt;　　　　要有。最好能有统一的error message，然后每个error message都带一个error number。这样，用户可以自己根据error number到user manual里面去看看错误的具体描述和可能原因，就像SQL Server的错误那样。同样，ASP.NET也要有统一的Exception处理。可以参考有关的Application Block。&lt;/P&gt;
&lt;P&gt;　　60. 你们有统一的代码书写规范么？&lt;BR&gt;　　　　要有。Code Convention很多，搞一份来发给大家就可以了。当然，要是有FxCop这种工具来检查代码就更好了。 &lt;/P&gt;
&lt;P&gt;　　61. 你们的每个人都了解项目的商业意义么？&lt;BR&gt;　　　　要。这是Vision的意思。别把项目只当成工作。有时候要想着自己是在为中国某某行业的信息化作先驱者，或者时不时的告诉team member，这个项目能够为某某某国家部门每年节省多少多少百万的纳税人的钱，这样就有动力了。平凡的事情也是可以有个崇高的目标的。&lt;/P&gt;
&lt;P&gt;　　 62. 产品各部分的界面和操作习惯一致么？&lt;BR&gt;　　　　要这样。要让用户觉得整个程序好像是一个人写出来的那样。&lt;/P&gt;
&lt;P&gt;　　 63. 有可以作为宣传亮点的Cool Feature么？&lt;BR&gt;　　　　要。这是增强团队凝聚力、信心的。而且，“一俊遮百丑”，有亮点就可以掩盖一些问题。这样，对于客户来说，会感觉产品从质量角度来说还是acceptable的。或者说，cool feature或者说亮点可以作为质量问题的一个事后弥补措施。 &lt;/P&gt;
&lt;P&gt;　　 64. 尽可能缩短产品的启动时间要这样。&lt;BR&gt;　　　　　软件启动时间（Start-Up time）是客户对性能好坏的第一印象。&lt;/P&gt;
&lt;P&gt;　　 65. 不要过于注重内在品质而忽视了第一眼的外在印象程序员容易犯这个错误：太看重性能、稳定性、存储效率，但忽视了外在感受。而高层经理、客户正相反。这两方面要兼顾，协调这些是PM的工作。&lt;/P&gt;
&lt;P&gt;　　 66. 你们根据详细产品功能说明书做开发么？&lt;BR&gt;　　　　要这样。要有设计才能开发，这是必须的。设计文档，应该说清楚这个产品会怎么运行，应该采取一些讲故事的方法。设计的时候千万别钻细节，别钻到数据库、代码等具体实现里面去，那些是后面的事情，一步步来不能着急。&lt;/P&gt;
&lt;P&gt;　 　67. 开始开发和测试之前每个人都仔细审阅功能设计么？&lt;BR&gt;　　　　要做。Function Spec review是用来统一思想的。而且，review过以后形成了一致意见，将来再也没有人可以说“你看，当初我就是反对这么设计的，现在吃苦头了吧”&lt;/P&gt;
&lt;P&gt;　　68. 所有人都始终想着The Whole Image么？&lt;BR&gt;　　　　要这样。项目里面每个人虽然都只是在制造一片叶子，但每个人都应该知道自己在制造的那片叶子所在的树是怎么样子的。我反对软件蓝领，反对过分的把软件制造看成流水线、车间。参见第61条。&lt;/P&gt;
&lt;P&gt;　　 69. Dev工作的划分是单纯纵向或横向的么？&lt;BR&gt;　　　　不能单纯的根据功能模块分，或者单纯根据表现层、中间层、数据库层分。我推荐这么做：首先根据功能模块分，然后每个“层”都有一个Owner来Review所有人的设计和代码，保证consistency。 &lt;/P&gt;
&lt;P&gt;　　70. 你们的程序员写程序设计说明文档么？&lt;BR&gt;　　　　要。不过我听说微软的程序员1999年以前也不写。所以说，写不写也不是绝对的，偷懒有时候也是可以的。参见第56条。&lt;/P&gt;
&lt;P&gt;　　71. 你在招人面试时让他写一段程序么？&lt;BR&gt;　　　　要的。我最喜欢让人做字符串和链表一类的题目。这种题目有很多循环、判断、指针、递归等，既不偏向过于考算法，也不偏向过于考特定的API。&lt;/P&gt;
&lt;P&gt;　　72. 你们有没有技术交流讲座？&lt;BR&gt;　　　　要的。每一两个礼拜搞一次内部的Tech Talk或者Chalk Talk吧。让组员之间分享技术心得，这笔花钱送到外面去培训划算。&lt;/P&gt;
&lt;P&gt;　　73. 你们的程序员都能专注于一件事情么？&lt;BR&gt;　　　　要让程序员专注一件事。例如说，一个部门有两个项目和10个人，一种方法是让10个人同时参加两个项目，每个项目上每个人都花50%时间；另一种方法是5个人去项目A，5个人去项目B，每个人都100%在某一个项目上。我一定选后面一种。这个道理很多人都懂，但很多领导实践起来就把属下当成可以任意拆分的资源了。 &lt;/P&gt;
&lt;P&gt;　　74. 你们的程序员会夸大完成某项工作所需要的时间么？&lt;BR&gt;　　　　会的，这是常见的，尤其会在项目后期夸大做某个change所需要的时间，以次来抵制change。解决的方法是坐下来慢慢磨，磨掉程序员的逆反心理，一起分析，并把估算时间的颗粒度变小。 &lt;/P&gt;
&lt;P&gt;　　75. 尽量不要用Virtual Heads 最好不要用Virtual Heads。&lt;BR&gt;　　　　Virtual heads意味着resource is not secure，shared resource会降低resource的工作效率，容易增加出错的机会，会让一心二用的人没有太多时间去review spec、review design。一个dedicated的人，要强过两个只能投入50%时间和精力的人。我是吃过亏的：7个part time的tester，发现的Bug和干的活，加起来还不如两个full-time的。参见第73条。73条是针对程序员的，75条是针对Resource Manager的。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;BR&gt;　转:http://www.uml.org.cn/UMLForum/200604142.htm&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=9355" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=9355</wfw:commentRss></entry><entry><title>ASP.NET Session详解</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2006/08/23/8125.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:8125</id><created>2006-08-23T08:20:00Z</created><content type="text/html" mode="escaped">ASP.NET Session详解&lt;BR&gt;&lt;BR&gt;
&lt;H3&gt;阅读本文章之前的准备&lt;/H3&gt;
&lt;P&gt;阅读本文章前，需要读者对以下知识有所了解。否则，阅读过程中会在相应的内容上遇到不同程度的问题。&lt;/P&gt;
&lt;UL type=square&gt;
&lt;LI&gt;懂得ASP/ASP.NET编程 
&lt;LI&gt;了解ASP/ASP.NET的Session模型 
&lt;LI&gt;了解ASP.NET Web应用程序模型 
&lt;LI&gt;了解ASP.NET Web应用程序配置文件Web.config的作用、意义及使用方法 
&lt;LI&gt;了解Internet Information Services(以下简称IIS)的基本使用方法 
&lt;LI&gt;了解如何在Microsoft SQL Server中创建一个数据库。 &lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Session模型简介&lt;/H3&gt;
&lt;P&gt;Session 是什么呢？简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时，可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台 WWW服务器建立连接时，他就与这个服务器建立了一个Session，同时服务器会自动为其分配一个SessionID，用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串，我们会在下面的实验中见到它的实际样子。&lt;/P&gt;
&lt;P&gt;这个唯一的 SessionID是有很大的实际意义的。当一个用户提交了表单时，浏览器会将用户的SessionID自动附加在HTTP头信息中，（这是浏览器的自动功能，用户不会察觉到），当服务器处理完这个表单后，将结果返回给SessionID所对应的用户。试想，如果没有SessionID，当有两个用户同时进行注册时，服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然，SessionID还有很多其他的作用，我们会在后面提及到。&lt;/P&gt;
&lt;P&gt;除了 SessionID，在每个Session中还包含很多其他信息。但是对于编写ASP或ASP.NET的程序与来说，最有用的还是可以通过访问 ASP/ASP.NET的内置Session对象，为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面，我们可能在用户可能访问到每个的页面中加入：&lt;/P&gt;
&lt;TABLE class=code cellSpacing=0 cellPadding=8 width="100%" bgColor=#e0e0e0 border=0&gt;

&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(255,255,0)"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;If&lt;/FONT&gt; Session("PageViewed") = ""&lt;FONT color=#0000ff&gt;Then&lt;/FONT&gt;&lt;BR&gt;　Session("PageViewed") = 1&lt;BR&gt;&lt;FONT color=#0000ff&gt;Else&lt;/FONT&gt;&lt;BR&gt;　Session("PageViewed") = Session("PageViewed") + 1&lt;BR&gt;&lt;FONT color=#0000ff&gt;End If&lt;/FONT&gt;&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(255,255,0)"&gt;%&amp;gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;通过以下这句话可以让用户得知自己浏览了几个页面：&lt;/P&gt;
&lt;TABLE class=code cellSpacing=0 cellPadding=8 width="100%" bgColor=#e0e0e0 border=0&gt;

&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(255,255,0)"&gt;&amp;lt;%&lt;/SPAN&gt;&lt;BR&gt;Response.Write("You have viewed " &amp;amp; Session("PageViewed") &amp;amp; " pages")&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(255,255,0)"&gt;%&amp;gt;&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;可能有些有些读者会问：这个看似像是数组的Session(“..”)是哪里来的？需要我定义吗？实际上，这个Session对象是具有ASP解释能力的的 WWW服务器的内建对象。也就是说ASP的系统中已经给你定义好了这个对象，你只需要使用就行了。其中Session(“..”)中的..就好像变量名称，Session(“..”)=$$$中的$$$就是变量的值了。你只需要写上句话，在这个用户的每个页面中都可以访问..变量中的值了。&lt;/P&gt;
&lt;P&gt;其实ASP一共内建了7个对象，有Session、Application、Cookie、Response、Request、Server等。在其他的服务器端脚本语言如JSP、PHP等中也有其类似的对象，只是叫法或者使用方法上不太一样。&lt;/P&gt;
&lt;H3&gt;ASP Session的功能的缺陷&lt;/H3&gt;
&lt;P&gt;目前ASP的开发人员都正在使用Session这一强大的功能，但是在他们使用的过程中却发现了ASP Session有以下缺陷：&lt;/P&gt;
&lt;UL type=square&gt;
&lt;LI&gt;进程依赖性：ASP Session状态存于IIS的进程中，也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时，这些信息也就丢失。另外，重起或者关闭IIS服务都会造成信息的丢失。 
&lt;LI&gt;Session 状态使用范围的局限性：刚一个用户从一个网站访问到另外一个网站时，这些Session信息并不会随之迁移过去。例如：新浪网站的WWW服务器可能不止一个，一个用户登录之后要去各个频道浏览，但是每个频道都在不同的服务器上，如果想在这些WWW服务器共享Session信息怎么办呢？ 
&lt;LI&gt;Cookie的依赖性：实际上客户端的Session信息是存储与Cookie中的，如果客户端完全禁用掉了Cookie功能，他也就不能享受到了Session提供的功能了。 &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;鉴于ASP Session的以上缺陷，微软的设计者们在设计开发 ASP.NET Session时进行了相应的改进，完全克服了以上缺陷，使得ASP.NET Session成为了一个更加强大的功能。&lt;/P&gt;
&lt;H3&gt;Web.config文件简介&lt;/H3&gt;
&lt;P&gt;有的ASP.NET程序员说：Web.config文件？我从来没有听说过啊，可是我写的程序不是也能很正常的运转吗？是的，你说得没错，没有 Web.config文件程序是可以正常运行的。但是，如果你做了一个大型的网站，需要对整个网站做一些整体配置，例如整个网站的页面使用何种语言编写的、网站的安全认证模式、Session信息存储方式等，这时你就需要使用Web.config文件了。虽然Web.config文件中的某些选项是可以通过IIS配置的，但是如果在Web.config中也有相应的设置就会覆盖掉IIS中的配置。而且，Web.config文件的最大的便利之处就是可以在ASP.NET页面中通过调用System.web名字空间访问Web.config中的设置。&lt;/P&gt;
&lt;P&gt;Web.config有两种，分别是服务器配置文件和Web应用程序配置文件，他们都名为Web.config。在这个配置文件中会保存当前IIS服务器中网页的使用哪种语言编写的、应用程序安全认证模式、Session信息存储方式的一系列信息。这些信息是使用XML语法保存的，如果想对其编辑，使用文本编辑器就行了。&lt;/P&gt;
&lt;P&gt;其中服务器配置文件会对IIS服务器下所有的站点中的所有应用程序起作用。在.NET Framework 1.0中，服务器的Web.config文件是存在：\WinNT\Microsoft.NET\Framework\v1.0.3705中的。&lt;/P&gt;
&lt;P&gt;而Web 应用程序配置文件Web.config则保存在各个Web应用程序中。例如：当前网站的根目录\Inetpub\wwwroot，而当前的Web应用程序为MyApplication，则Web应用程序根目录就应为：\Inetpub\wwwroot\MyApplication。如果你的网站有且只有一个Web应用程序，一般说来应用程序的根目录就是\Inetpub\wwwroot。如果想添加一个Web应用程序，在IIS中添加一个具有应用程序起始点的虚拟目录就行了。这个目录下的文件及目录将被视为一个Web应用程序。但是，这样通过IIS添加Web应用程序是不会为你生成Web.config文件的。如果想创建一个带有Web.config文件的Web应用程序，需要使用Visual Studio.NET，新建一个Web应用程序项目。&lt;/P&gt;
&lt;P&gt;Web应用程序的配置文件Web.config是可选的，可有可无。如果没有，每个Web应用程序会使用服务器的Web.config配置文件。如果有，则会覆盖服务器Web.config配置文件中相应的值。&lt;/P&gt;
&lt;P&gt;在ASP.NET中，Web.config修改保存后会自动立刻成效，不用再像ASP中的配置文件修改后需要重新启动Web应用程序才能生效了。&lt;/P&gt;
&lt;H3&gt;Web.config文件中的Session配置信息&lt;/H3&gt;
&lt;P&gt;打开某个应用程序的配置文件Web.config后，我们会发现以下这段：&lt;/P&gt;
&lt;DIV align=center&gt;
&lt;TABLE class=code cellSpacing=0 cellPadding=8 width="90%" bgColor=#e0e0e0 border=0&gt;

&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;sessionState&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　mode&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="InProc"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　stateConnectionString&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="tcpip=127.0.0.1:42424"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　sqlConnectionString&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="data source=127.0.0.1;Trusted_Connection=yes"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　cookieless&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="false"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　timeout&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="20"&lt;/FONT&gt; &lt;BR&gt;/&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P&gt;这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的：&lt;/P&gt;
&lt;TABLE cellSpacing=0 cellPadding=8 width="100%" bgColor=#e0e0e0 border=0&gt;

&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;PRE style="FONT-SIZE: 9pt; FONT-FAMILY: Courier New"&gt;&lt;STRONG&gt;&amp;lt;sessionState&lt;/STRONG&gt; &lt;STRONG&gt;mode&lt;/STRONG&gt;=&lt;EM&gt;"Off|InProc|StateServer|SQLServer"&lt;/EM&gt;&lt;BR&gt;&lt;STRONG&gt;              cookieless&lt;/STRONG&gt;=&lt;EM&gt;"true|false"&lt;/EM&gt;&lt;BR&gt;&lt;STRONG&gt;              timeout&lt;/STRONG&gt;=&lt;EM&gt;"number of minutes"&lt;/EM&gt;&lt;BR&gt;&lt;STRONG&gt;              stateConnectionString&lt;/STRONG&gt;=&lt;EM&gt;"tcpip=server:port"&lt;/EM&gt;&lt;BR&gt;&lt;STRONG&gt;              sqlConnectionString&lt;/STRONG&gt;=&lt;EM&gt;"sql connection string"&lt;/EM&gt;&lt;BR&gt;&lt;STRONG&gt;              stateNetworkTimeout=&lt;/STRONG&gt;&lt;EM&gt;"number of seconds"&lt;/EM&gt;&lt;BR&gt;&lt;STRONG&gt;/&amp;gt;&lt;/STRONG&gt;&lt;/PRE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;必须有的属性是&lt;/P&gt;
&lt;TABLE style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=4 width="100%" border=1&gt;

&lt;TR style="FONT-WEIGHT: bold" bgColor=#e0e0e0&gt;
&lt;TD width="12%"&gt;属性&lt;/TD&gt;
&lt;TD width="12%"&gt;选项&lt;/TD&gt;
&lt;TD width="76%"&gt;描述&lt;/TD&gt;&lt;/TR&gt;

&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;mode&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;设置将Session信息存储到哪里&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;Off&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;设置为不使用Session功能&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;InProc&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;设置为将Session存储在进程内，就是ASP中的存储方式，这是默认值。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;StateServer&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;设置为将Session存储在独立的状态服务中。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;SQLServer&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;设置将Session存储在SQL Server中。&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;可选的属性是：&lt;/P&gt;
&lt;TABLE style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=4 width="100%" border=1&gt;

&lt;TR style="FONT-WEIGHT: bold" bgColor=#e0e0e0&gt;
&lt;TD width="18%"&gt;属性&lt;/TD&gt;
&lt;TD width="6%"&gt;选项&lt;/TD&gt;
&lt;TD width="76%"&gt;描述&lt;/TD&gt;&lt;/TR&gt;

&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;cookieless&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;设置客户端的Session信息存储到哪里&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;ture&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;使用Cookieless模式&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;false&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;使用Cookie模式，这是默认值。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;timeout&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;stateConnectionString&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;设置将Session信息存储在状态服务中时使用的服务器名称和端口号，例如："tcpip=127.0.0.1:42424”。当&lt;STRONG&gt;mode&lt;/STRONG&gt;的值是&lt;STRONG&gt;StateServer&lt;/STRONG&gt;是，这个属性是必需的。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;sqlConnectionString&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当&lt;STRONG&gt;mode&lt;/STRONG&gt;的值是&lt;STRONG&gt;SQLServer&lt;/STRONG&gt;时，这个属性是必需的。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;stateNetworkTimeout&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;BR&gt;&lt;/TD&gt;
&lt;TD&gt;设置当使用StateServer模式存储Session状态时，经过多少秒空闲后，断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;H3&gt;ASP.NET中客户端Session状态的存储&lt;/H3&gt;
&lt;P&gt;在我们上面的Session模型简介中，大家可以发现Session状态应该存储在两个地方，分别是客户端和服务器端。客户端只负责保存相应网站的 SessionID，而其他的Session信息则保存在服务器端。在ASP中，客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie，那末他也就无法享受Session的便利之处了，甚至造成不能访问某些网站。为了解决以上问题，在 ASP.NET中客户端的Session信息存储方式分为：Cookie和Cookieless两种。&lt;/P&gt;
&lt;P&gt;ASP.NET中，默认状态下，在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下：&lt;/P&gt;
&lt;P&gt;找到当前Web应用程序的根目录，打开Web.Config文件，找到如下段落：&lt;/P&gt;
&lt;DIV align=center&gt;
&lt;TABLE class=code cellSpacing=0 cellPadding=8 width="90%" bgColor=#e0e0e0 border=0&gt;

&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;sessionState&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　mode&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="InProc"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　stateConnectionString&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="tcpip=127.0.0.1:42424"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　sqlConnectionString&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="data source=127.0.0.1;Trusted_Connection=yes"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　cookieless&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="false"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　timeout&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="20"&lt;/FONT&gt; &lt;BR&gt;/&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P&gt;这段话中的&lt;SPAN class=code style="COLOR: red; BACKGROUND-COLOR: rgb(224,224,224)"&gt;cookieless&lt;FONT color=#0000ff&gt;="false"&lt;/FONT&gt;&lt;/SPAN&gt;改为：&lt;SPAN class=code style="COLOR: red; BACKGROUND-COLOR: rgb(224,224,224)"&gt;cookieless&lt;FONT color=#0000ff&gt;="true"&lt;/FONT&gt;&lt;/SPAN&gt;，这样，客户端的Session信息就不再使用Cookie存储了，而是将其通过URL存储。关闭当前的IE，打开一个新IE，重新访问刚才的Web应用程序，就会看到类似下面的样子：&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG height=119 alt="" src="http://www.360doc.com/DownloadImg/2108/30792_1.gif" width=479 border=0&gt;&lt;/P&gt;
&lt;P&gt;其中，&lt;SPAN style="BACKGROUND-COLOR: rgb(224,224,224)"&gt;http://&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(224,224,224)"&gt;localhost&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(224,224,224)"&gt;/&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(224,224,224)"&gt;MyTestApplication&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(224,224,224)"&gt;/&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(224,224,224)"&gt;(ulqsek45heu3ic2a5zgdl245)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(224,224,224)"&gt;/&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR: rgb(224,224,224)"&gt;default.aspx&lt;/SPAN&gt;中黑体标出的就是客户端的Session ID。注意，这段信息是由IIS自动加上的，不会影响以前正常的连接。&lt;/P&gt;
&lt;H3&gt;ASP.NET中服务器端Session状态的存储&lt;/H3&gt;
&lt;P&gt;&lt;STRONG&gt;准备工作&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;为了您能更好的体验到实验现象，您可以建立一个叫做SessionState.aspx的页面，然后把以下这些代码添加到&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;中。&lt;/P&gt;
&lt;TABLE class=code cellSpacing=0 cellPadding=8 width="100%" bgColor=#e0e0e0 border=0&gt;

&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;script&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server"&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;Sub&lt;/FONT&gt; Session_Add(sender &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; Object, e &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; EventArgs)&lt;BR&gt;　&amp;nbsp; Session("MySession") = text1.Value&lt;BR&gt;　&amp;nbsp; span1.InnerHtml = "Session data updated! &amp;lt;P&amp;gt;Your session contains: &amp;lt;font color=red&amp;gt;" &amp;amp; \&lt;BR&gt;　　　　　　　　　　&amp;nbsp; Session("MySession").ToString() &amp;amp; "&amp;lt;/font&amp;gt;"&lt;BR&gt;&lt;FONT color=#0000ff&gt;End Sub&lt;BR&gt;&lt;BR&gt;Sub&lt;/FONT&gt; CheckSession(sender &lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; Object, e&lt;FONT color=#0000ff&gt;As&lt;/FONT&gt; EventArgs)&lt;BR&gt;&lt;FONT color=#0000ff&gt;　&amp;nbsp; If&lt;/FONT&gt; (Session("MySession")&lt;FONT color=#0000ff&gt;Is Nothing&lt;/FONT&gt;) &lt;FONT color=#0000ff&gt;Then&lt;/FONT&gt;&lt;BR&gt;　　　 span1.InnerHtml = "NOTHING, SESSION DATA LOST!"&lt;BR&gt;&lt;FONT color=#0000ff&gt;　&amp;nbsp; Else&lt;/FONT&gt;&lt;BR&gt;　　　 span1.InnerHtml = "Your session contains: &amp;lt;font color=red&amp;gt;" &amp;amp; \&lt;BR&gt;　　　　　　　　　　　　 Session("MySession").ToString() &amp;amp; "&amp;lt;/font&amp;gt;"&lt;BR&gt;&lt;FONT color=#0000ff&gt;End If&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000&gt;script&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;form&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;id&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="Form2"&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;　&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;input&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;id&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="text1"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;type&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="text"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="text1"&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;　&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;input&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;type&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="submit"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;OnServerClick&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="Session_Add"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;&lt;BR&gt;　　　　　 value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="Add to Session State"&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;id&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="Submit1"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="Submit1"&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;　&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;input&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;type&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="submit"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;OnServerClick&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="CheckSession"&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;　　　　　 value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="View Session State"&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;id&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="Submit2"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="Submit2"&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000&gt;form&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;hr&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;size&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="1"&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;font&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;size&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="6"&amp;gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;span&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;id&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="span1"&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;runat&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="server" /&amp;gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000&gt;font&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;这个SessionState.aspx的页面可以用来测试在当前的服务器上是否丢失了Session信息。&lt;/P&gt;
&lt;H3&gt;将服务器Session信息存储在进程中&lt;/H3&gt;
&lt;P&gt;让我们来回到Web.config文件的刚才那段段落中：&lt;/P&gt;
&lt;DIV align=center&gt;
&lt;TABLE class=code cellSpacing=0 cellPadding=8 width="90%" bgColor=#e0e0e0 border=0&gt;

&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;sessionState&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　mode&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="InProc"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　stateConnectionString&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="tcpip=127.0.0.1:42424"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　sqlConnectionString&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="data source=127.0.0.1;Trusted_Connection=yes"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　cookieless&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="false"&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;　　timeout&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="20"&lt;/FONT&gt; &lt;BR&gt;/&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P&gt;当&lt;STRONG&gt;mode&lt;/STRONG&gt;的值是&lt;STRONG&gt;InProc&lt;/STRONG&gt;时，说明服务器正在使用这种模式。&lt;/P&gt;
&lt;P&gt;这种方式和以前ASP中的模式一样，就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后，这些信息都会丢失。但是这种模式也有自己最大好处，就是性能最高。应为所有的Session信息都存储在了IIS的进程中，所以IIS能够很快的访问到这些信息，这种模式的性能比进程外存储 Session信息或是在SQL Server中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。&lt;/P&gt;
&lt;P&gt;好了，现在让我们做个试验。打开刚才的SessionState.aspx页面，随便输入一些字符，使其存储在Session中。然后，让我们让IIS重起。注意，并不是使当前的站点停止再开始，而是在IIS中本机的机器名的节点上点击鼠标右键，选择重新启动IIS。(想当初使用NT4时，重新启动IIS必须要重新启动计算机才行，微软真是@#$%^&amp;amp;)返回到SessionState.aspx页面中，检查刚才的Session信息，发现信息已经丢失了。&lt;/P&gt;
&lt;H3&gt;将服务器Session信息存储在进程外&lt;/H3&gt;
&lt;P&gt;首先，让我们来打开管理工具-&amp;gt;服务，找到名为：ASP.NET State Service的服务，启动它。实际上，这个服务就是启动一个要保存Session信息的进程。启动这个服务后，你可以从Windows任务管理器- &amp;gt;进程中看到一个名为aspnet_state.exe的进程，这个就是我们保存Session信息的进程。&lt;/P&gt;
&lt;P&gt;然后，回到Web.config文件中上述的段落中，将&lt;STRONG&gt;mode&lt;/STRONG&gt;的值改为&lt;STRONG&gt;StateServer&lt;/STRONG&gt;。保存文件后的重新打开一个IE，打开SessionState.aspx页面，保存一些信息到Session中。这时，让我们重起IIS，再回到SessionState.aspx页面中查看刚才的Session信息，发现没有丢失。&lt;/P&gt;
&lt;P&gt;实际上，这种将Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外，还可以将Session信息存储在其他的服务器的进程中。这时，不光需要将&lt;STRONG&gt;mode&lt;/STRONG&gt;的值改为&lt;STRONG&gt;StateServer&lt;/STRONG&gt;，还需要在&lt;STRONG&gt;stateConnectionString&lt;/STRONG&gt;中配置相应的参数。例如你的计算你是192.168.0.1，你想把Session存储在IP为192.168.0.2的计算机的进程中，就需要设置成这样：&lt;SPAN class=code style="COLOR: red; BACKGROUND-COLOR: rgb(224,224,224)"&gt;stateConnectionString&lt;FONT color=#0000ff&gt;="tcpip=192.168.0.2:42424"&lt;/FONT&gt;&lt;/SPAN&gt;。当然，不要忘记在192.168.0.2的计算机中装上.NET Framework，并且启动ASP.NET State Services服务。&lt;/P&gt;
&lt;H3&gt;将服务器Session信息存储在SQL Server中&lt;/H3&gt;
&lt;P&gt;首先，还是让我们来做一些准备工作。启动SQL Server和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库，及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件：&lt;/P&gt;
&lt;DIV align=center&gt;
&lt;TABLE class=code cellSpacing=0 cellPadding=8 width="90%" bgColor=#e0e0e0 border=0&gt;

&lt;TR&gt;
&lt;TD width="100%"&gt;[system drive]\winnt\Microsoft.NET\Framework\[version]\&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P&gt;然后打开查询分析器，连接到SQL Server服务器，打开刚才的那个文件并且执行。稍等片刻，数据库及作业就建立好了。这时，你可以打开企业管理器，看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程，没有用户表。实际上Session信息是存储在了tempdb数据库的 ASPStateTempSessions表中的，另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理-&amp;gt;SQL Server代理-&amp;gt;作业，发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业，这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。&lt;/P&gt;
&lt;P&gt;接着，我们返回到Web.config文件，修改&lt;STRONG&gt;mode&lt;/STRONG&gt;的值改为&lt;STRONG&gt;SQLServer&lt;/STRONG&gt;。注意，还要同时修改&lt;STRONG&gt;sqlConnectionString&lt;/STRONG&gt;的值，格式为：&lt;SPAN class=code style="COLOR: red; BACKGROUND-COLOR: rgb(224,224,224)"&gt;sqlConnectionString&lt;FONT color=#0000ff&gt;="data source=localhost; Integrated Security=SSPI;"&lt;/FONT&gt;&lt;/SPAN&gt;，其中data source是指SQL Server服务器的IP地址，如果SQL Server与IIS是一台机子，写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证，这样，访问数据库将以ASP.NET的身份进行，通过如此配置，能够获得比使用 userid=sa;password=口令的SQL Server验证方式更好的安全性。当然，如果SQL Server运行于另一台计算机上，你可能会需要通过Active Directory域的方式来维护两边验证的一致性。&lt;/P&gt;
&lt;P&gt;同样，让我们做个试验。向SessionState.aspx中添加Session信息，这时发现Session信息已经存在SQL Server中了，即使你重起计算机，刚才的Session信息也不会丢失。现在，你已经完全看见了Session信息到底是什么样子的了，而且又是存储在SQL Server中的，能干什么就看你的发挥了，哈哈。&lt;/P&gt;
&lt;H3&gt;总结&lt;/H3&gt;
&lt;P&gt;通过这篇文章，你可以看到在Session的管理和维护上，ASP.NET比ASP有了很大的进步，我们可以更加随意的挑选适合的方法了。对于企业级的应用来说，这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的。相信在强大的微软支持下，新一代的电子商务平台将会搭建的更好！&lt;/P&gt;
&lt;P&gt;同时，大家也会发现，在这个整个技术中包括了操作系统、 Web服务及数据库多种技术的整合。&amp;nbsp;&lt;/P&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P id=TBPingURL&gt;Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1105240&lt;/P&gt;&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=8125" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=8125</wfw:commentRss></entry><entry><title>VS.NET2003(c#)命名规范</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2006/08/23/8124.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:8124</id><created>2006-08-23T07:59:00Z</created><content type="text/html" mode="escaped">&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;

&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Type&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Prefix&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Example&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Array&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;arr&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;arrShoppingList&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Boolean&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;bln&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;blnIsPostBack&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Byte&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;byt&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;bytPixelValue&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Char&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;chr&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;chrDelimiter&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DateTime&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dtm&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dtmStartDate&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Decimal&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dec&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;decAverageHeight&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Double&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dbl&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dblSizeofUniverse&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Integer&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;int&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;intRowCounter&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Long&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lng&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lngBillGatesIncome&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Object&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;obj&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;objReturnValue&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Short&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;shr&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;shrAverage&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Single&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;sng&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;sngMaximum&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;String&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;str&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;strFirstName&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color=#0000ff&gt;WebControls&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;

&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Type&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Prefix&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Example&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;AdRotator&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;adrt&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;adrtTopAd&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Button&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;btn&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;btnSubmit&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Calendar&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;cal&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;calMettingDates&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;CheckBox&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;chk&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;chkBlue&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;CheckBoxList&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;chkl&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;chklFavColors&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;CompareValidator&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valc&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valcValidAge&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;CustomValidator&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valx&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valxDBCheck&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataGrid&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dgrd&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dgrdTitles&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataList&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dlst&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dlstTitles&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DropDownList&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;drop&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dropCountries&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;HyperLink&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lnk&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lnkDetails&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Image&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;img&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;imgAuntBetty&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;ImageButton&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;ibtn&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;ibtnSubmit&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Label&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lbl&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lblResults&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;LinkButton&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lbtn&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lbtnSubmit&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;ListBox&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lst&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;lstCountries&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Panel&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;pnl&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;pnlForm2&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;PlaceHolder&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;plh&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;plhFormContents&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;RadioButton&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;rad&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;radFemale&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;RadioButtonList&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;radl&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;radlGender&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;RangeValidator&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valg&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valgAge&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;RegularExpression&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;vale&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valeEmail_Validator&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Repeater&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;rpt&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;rptQueryResults&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;RequiredFieldValidator&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valr&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valrFirstName&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Table&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;tbl&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;tblCountryCodes&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;TableCell&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;tblc&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;tblcGermany&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;TableRow&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;tblr&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;tblrCountry&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;TextBox&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;txt&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;txtFirstName&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;ValidationSummary&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;vals&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;valsFormErrors&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;XML&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;xmlc&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;xmlcTransformResults&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color=#0000ff&gt;ADO.NET&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=0&gt;

&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;Type&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;Prefix&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;Example&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Connection&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;con&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;conNorthwind&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Command&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;cmd&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;cmdReturnProducts&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;Parameter&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;parm&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;parmProductID&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataAdapter&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dad&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dadProducts&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataReader&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dtr&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dtrProducts&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataSet&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dst&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dstNorthWind&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataTable&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dtbl&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dtblProduct&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataRow&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;drow&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;drowRow98&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataColumn&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dcol&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dcolProductID&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataRelation&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;drel&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;drelMasterDetail&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;DataView&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dvw&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD width=197&gt;
&lt;P&gt;&lt;FONT size=2&gt;dvwFilteredProducts&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;&amp;nbsp;&lt;BR&gt;&lt;BR&gt;
&lt;P id=TBPingURL&gt;Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1103103&lt;/P&gt;&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=8124" width="1" height="1"&gt;</content><slash:comments>123</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=8124</wfw:commentRss></entry><entry><title>ASP.NET 2.0服务器控件开发----控件生命周期</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2006/08/23/8123.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:8123</id><created>2006-08-23T07:58:00Z</created><content type="text/html" mode="escaped">&lt;DIV class=postText&gt;服务器控件生命周期简介 
&lt;P&gt;　　服务器控件的生命周期是创建服务器控件最重要的概念。作为开发人员，必须对服务器控件生命周期深刻理解。当然，这不是一朝一夕就可以做到的。对于学习控件开发技术的初学者，可以不必掌握得非常详细深入，只需对服务器控件的生命周期中的不同阶段有一个大致的了解即可。&lt;/P&gt;
&lt;P&gt;　　在掌握服务器控件生命周期的过程中，读者要特别注意有关服务器控件状态的相关内容。在重点了解生命周期各个阶段的同时，对服务器控件的状态变化要注意以下问题：控件的生命周期何时保存控件和恢复其状态；何时与页面及其他控件之间进行交互；何时执行重要的处理逻辑；在各个阶段，控件可使用哪些信息、保持哪些数据、控件呈现时处于哪种状态以及何时输出显示标记文本等。如下列举了服务器控件生命周期所要经历的11个阶段。&lt;/P&gt;
&lt;P&gt;　　（1）初始化-- --在此阶段中，主要完成两项工作：一、初始化在传入Web请求生命周期内所需的设置；二、跟踪视图状态。首先，页面框架通过默认方式引发Init事件，并调用OnInit()方法，控件开发人员可以重写该方法为控件提供初始化逻辑。此后，页面框架将调用TrackViewState方法来跟踪视图状态。需要注意的是：多数情况下，Control基类提供的TrackViewState方法实现已经足够了。只有在控件定义了复杂属性时，开发人员才可能需要重写TrackViewState方法。&lt;/P&gt;
&lt;P&gt;　　（2）加载视图状态----此阶段的主要任务是检查服务器控件是否存在以及是否需要将其状态恢复到它在处理之前的请求结束的状态。因此该过程发生在页面回传过程中，而不是初始化请求过程。在此阶段，页面框架将自动恢复ViewState字典。如果服务器控件不维持其状态，或者它有能力通过默认方式保存其所有状态而使用ViewState字典，那么开发人员则不必实现任何逻辑。针对那些无法在 ViewState字典中存储的数据类型或者需要自定义状态管理的情况，开发人员可以通过重写LoadViewState方法来自定义状态的恢复和管理。&lt;/P&gt;
&lt;P&gt;　　（3）处理回发数据----若要使控件能够检查客户端发回的窗体数据，那么必须实现System.Web.UI.IPostBackDataHandler接口的　LoadPostData()方法。因此只有处理回发数据的控件参与此阶段。&lt;/P&gt;
&lt;P&gt;　　（4）加载----至此阶段开始，控件树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。此时，开发人员可以通过重写OnLoad()方法来实现每个请求共同的逻辑。&lt;/P&gt;
&lt;P&gt;　　（5）发送回发更改通知----在此阶段，服务器控件通过引发事件作为一种信号，表明由于回发而发生的控件状态变化（因此该阶段仅用于回发过程）。为了建立这种信号，开发人员必须再次使用System.Web.UI.IPostBackDataHandler接口，并实现另一方法- RaisePostBackChangedEvent()。其判断过程为：如果控件状态因回发而更改，则LoadPostData()返回true；否则返回false。页面框架跟踪所有返回true的控件并在这些控件上调用RaisePostDataChangedEvent()。&lt;/P&gt;
&lt;P&gt;　　（6）处理回发事件----该阶段处理引起回发的客户端事件。为了便于将客户端事件映射到服务器端事件上进行处理，开发人员在此阶段可以通过实现 System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent()方法来实现该逻辑。由此途径，服务器控件将成功捕获回发的客户端事件进行服务器端的相应处理。&lt;/P&gt;
&lt;P&gt;　　（7）预呈现----该阶段完成在生成控件之前所需要的任何工作。通常情况下是通过重写OnPreRender()方法完成该工作。需要注意的是：在该阶段，可以保存在预呈现阶段对控件状态所做的更改，而在呈现阶段进行的更改则会丢失。&lt;/P&gt;
&lt;P&gt;　　（8）保存状态----如果服务器控件不维持状态，或者它有能力通过默认方式保存其所有状态而使用ViewState字典，那么开发人员不必在该阶段实现任何逻辑。因为这个保存状态的过程是自动的。如果服务器控件需要自定义状态保存，或者控件无法在ViewState字典中存储特殊的数据类型，则需要通过重写SaveViewState()方法来实现状态保存。&lt;/P&gt;
&lt;P&gt;　　（9）呈现----表示向HTTP输出流中写入标记文本的过程。开发人员通过重写Render()方法使其在输出流上自定义标记文本。&lt;/P&gt;
&lt;P&gt;　　（10）处置----在此阶段中，通过重写Dispose ()方法完成释放对昂贵资源的引用，如数据库链接等。&lt;/P&gt;
&lt;P&gt;　　（11）卸载----完成的工作与"处置"阶段相同，但是，开发人员通常在Dispose()方法中执行清除，而不处理Unload事件。&lt;/P&gt;
&lt;P&gt;　　小结&lt;/P&gt;
&lt;P&gt;　　服务器控件在ASP.NET 2.0框架中起着举足轻重的作用，是构建Web应用程序最关键、最重要的组成元素。对于一个优秀的开发人员，掌握服务器控件的基础知识是非常重要的。本文就服务器控件的概念、类型、生命周期等关键内容进行了介绍。希望读者能够将这些内容牢固掌握，为写出精彩的服务器控件打下良好的基础。&lt;/P&gt;&amp;nbsp;&lt;BR&gt;&lt;BR&gt;
&lt;P id=TBPingURL&gt;Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1105362&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://www.kisssunshine.com/aggbug.aspx?PostID=8123" width="1" height="1"&gt;</content><slash:comments>1</slash:comments><wfw:commentRss>http://www.kisssunshine.com/blogs/sea/commentrss.aspx?PostID=8123</wfw:commentRss></entry><entry><title>.NET程序中常用的代码</title><link rel="alternate" type="text/html" href="http://www.kisssunshine.com/blogs/sea/archive/2006/08/14/8071.aspx" /><id>347c26f8-00f8-4370-9fa8-aa20bb9b0b05:8071</id><created>2006-08-14T04:30:00Z</created><content type="text/html" mode="escaped">1. 打开新的窗口并传送参数：　　传送参数： &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;response.write("＜script＞window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&amp;amp;id1="+...+"’)＜/script＞") &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　接收参数： &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;string a = Request.QueryString("id"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;string b = Request.QueryString("id1"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　2.为按钮添加对话框 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;Button1.Attributes.Add("onclick","return confirm(’确认?’)"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}") &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　3.删除表格选定记录 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex]; &lt;BR&gt;&amp;nbsp;&amp;nbsp;string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString() &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　4.删除表格记录警告 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e) &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　switch(e.Item.ItemType) &lt;BR&gt;&amp;nbsp;&amp;nbsp;　{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　case ListItemType.Item : &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　case ListItemType.AlternatingItem : &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　case ListItemType.EditItem: &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　TableCell myTableCell; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　myTableCell = e.Item.Cells[14]; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　LinkButton myDeleteButton ; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　myDeleteButton = (LinkButton)myTableCell.Controls[0]; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　myDeleteButton.Attributes.Add("onclick","return confirm(’您是否确定要删除这条信息’);"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　break; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　default: &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　break; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　} &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　5.点击表格行链接另一页 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　//点击表格打开 &lt;BR&gt;&amp;nbsp;&amp;nbsp;　if (e.Item.ItemType == ListItemType.Item e.Item.ItemType == ListItemType.AlternatingItem) &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　双击表格连接到另一页 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　在itemDataBind事件中 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;if(e.Item.ItemType == ListItemType.Item e.Item.ItemType == ListItemType.AlternatingItem) &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　string OrderItemID =e.item.cells[1].Text; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　... &lt;BR&gt;&amp;nbsp;&amp;nbsp;　e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　双击表格打开新一页 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;if(e.Item.ItemType == ListItemType.Item e.Item.ItemType == ListItemType.AlternatingItem) &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　string OrderItemID =e.item.cells[1].Text; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　... &lt;BR&gt;&amp;nbsp;&amp;nbsp;　e.item.Attributes.Add("ondblclick", "open(’../ShippedGrid.aspx?id=" + OrderItemID + "’)"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;6.表格超连接列传递参数 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;＜asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id=’ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　＜%# DataBinder.Eval(Container.DataItem, "数据字段1")%＞’ &amp;amp; name=’＜%# DataBinder.Eval(Container.DataItem, "数据字段2")%＞’ /＞ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　7.表格点击改变颜色 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;if (e.Item.ItemType == ListItemType.Item e.Item.ItemType == ListItemType.AlternatingItem) &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　e.Item.Attributes.Add("onclick","this.style.backgroundColor=’#99cc00’; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　 this.style.color=’buttontext’;this.style.cursor=’default’;"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　写在DataGrid的_ItemDataBound里 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;if (e.Item.ItemType == ListItemType.Item e.Item.ItemType == ListItemType.AlternatingItem) &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;e.Item.Attributes.Add("onmouseover","this.style.backgroundColor=’#99cc00’; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　this.style.color=’buttontext’;this.style.cursor=’default’;"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=’’;this.style.color=’’;"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　8.关于日期格式 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　日期格式设定 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;DataFormatString="{0:yyyy-MM-dd}" &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　我觉得应该在itembound事件中 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd")) &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　9.获取错误信息并到指定页面 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　不要使用Response.Redirect,而应该使用Server.Transfer &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　e.g &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;// in global.asax &lt;BR&gt;&amp;nbsp;&amp;nbsp;protected void Application_Error(Object sender, EventArgs e) { &lt;BR&gt;&amp;nbsp;&amp;nbsp;if (Server.GetLastError() is HttpUnhandledException) &lt;BR&gt;&amp;nbsp;&amp;nbsp;Server.Transfer("MyErrorPage.aspx"); &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;//其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了 :) &lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　Redirect会导致post－back的产生从而丢失了错误信息，所以页面导向应该直接在服务器端执行，这样就可以在错误处理页面得到出错信息并进行相应的处理 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　10.清空Cookie &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;Cookie.Expires=[DateTime]; &lt;BR&gt;&amp;nbsp;&amp;nbsp;Response.Cookies("UserName").Expires = 0 &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　11.自定义异常处理 &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;//自定义异常处理类 &lt;BR&gt;&amp;nbsp;&amp;nbsp;using System; &lt;BR&gt;&amp;nbsp;&amp;nbsp;using System.Diagnostics; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;namespace MyAppException &lt;BR&gt;&amp;nbsp;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　/// ＜summary＞ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　/// 从系统异常类ApplicationException继承的应用程序异常处理类。 &lt;BR&gt;&amp;nbsp;&amp;nbsp;　/// 自动将异常内容记录到Windows NT/2000的应用程序日志 &lt;BR&gt;&amp;nbsp;&amp;nbsp;　/// ＜/summary＞ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　public class AppException:System.ApplicationException &lt;BR&gt;&amp;nbsp;&amp;nbsp;　{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　public AppException() &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误。"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　} &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　public AppException(string message) &lt;BR&gt;&amp;nbsp;&amp;nbsp;　{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　LogEvent(message); &lt;BR&gt;&amp;nbsp;&amp;nbsp;　} &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　public AppException(string message,Exception innerException) &lt;BR&gt;&amp;nbsp;&amp;nbsp;　{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　LogEvent(message); &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　if (innerException != null) &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　LogEvent(innerException.Message); &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　} &lt;BR&gt;&amp;nbsp;&amp;nbsp;　} &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　//日志记录类 &lt;BR&gt;&amp;nbsp;&amp;nbsp;　using System; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　using System.Configuration; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　using System.Diagnostics; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　using System.IO; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　using System.Text; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　using System.Threading; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;　namespace MyEventLog &lt;BR&gt;&amp;nbsp;&amp;nbsp;　{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　/// ＜summary＞ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　/// 事件日志记录类，提供事件日志记录支持 &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　/// ＜remarks＞ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　/// 定义了4个日志记录方法 (error, warning, info, trace) &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　/// ＜/remarks＞ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　/// ＜/summary＞ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　public class ApplicationLog &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;　　　/// ＜summary