文升's profileMy SpacePhotosBlogLists Tools Help

Blog


    February 13

    Windows 2003网络负载均衡的实现

    一、网络负载平衡的优点

      1.网络负载平衡允许你将传入的请求传播到最多达32台的服务器上,即可以使用最多32台服务器共同分担对外的网络请求服务。网络负载平衡技术保证即使是在负载很重的情况下它们也能作出快速响应。

      2.网络负载平衡对外只须提供一个IP地址(或域名)。

      3.如果网络负载平衡中的一台或几台服务器不可用时,服务不会中断。网络负载平衡自动检测到服务器不可用时,能够迅速在剩余的服务器中重新指派客户机通讯。此保护措施能够帮助你为关键的业务程序提供不中断的服务。可以根据网络访问量的增多来增加网络负载平衡服务器的数量。

      4.网络负载平衡可在普通的计算机上实现。

      在Windows Server 2003中,网络负载平衡的应用程序包括Internet信息服务(IIS)、ISA Server 2000防火墙与代理服务器、VPN虚拟专用网、终端服务器、Windows Media Services(Windows视频点播、视频广播)等服务。同时,网络负载平衡有助于改善你的服务器性能和可伸缩性,以满足不断增长的基于Internet客户端的需求。

      网络负载平衡可以让客户端用一个逻辑Internet名称和虚拟IP地址(又称群集IP地址)访问群集,同时保留每台计算机各自的名称。

      下面,我们将在两台安装Windows Server 2003的普通计算机上,介绍网络负载平衡的实现及应用。
    这两台计算机中,一台计算机名称为w2003-1,IP地址为202.206.197.190,另一台名为w2003-2,IP地址为202.206.197.191。

      规划网络负载平衡群集使用的IP地址为202.206.197.195,规划网络负载平衡群集完整的计算机名称为cluster.heinfo.edu.cn。你需要在heinfo.edu.cn域中注册此主机名称并将地址设置为202.206.197.195。如果你没有DNS,可以在需要访问网络负载平衡的客户机(包括网络负载平衡主机)上编辑%systemroot%system32driversetc目录下的hosts文件,添加一条信息"202.206.197.195 cluster.heinfo.edu.cn",即可解决DNS域名解析的问题。

      当正式应用时,客户机只需要使用cluster.heinfo.edu.cn或IP地址202.206.197.195来访问服务器,网络服务平衡会根据每台服务器的负载情况自动选择202.206.197.190或者202.206.197.191对外提供服务。

      网络负载平衡的实现过程如下:

      在实现网络负载平衡的每一台计算机上,只能安装TCP/IP协议,不要安装任何其他的协议(如IPX协议或者NetBEUI协议),在网络属性中,"网络负载平衡"也不能被选择,这可以从"网络连接属性"中查看。

      ①先进入第一台计算机,以管理员身份登录,从"管理工具"中运行"网络负载平衡管理器",用鼠标右键单击"网络负载平衡群集",从出现的菜单中选择"新建群集",进入"群集参数"界面。



      在"IP地址"后面输入规划的群集参数地址202.206.197.195,在子网掩码处使用默认值,在"完整Internet名称"后面输入cluster.heinfo.edu.cn(也可以是其他的名称,但输入的DNS名称必须与输入的IP地址相符)。

      如果允许远程控制,请选中"允许远程控制",并在"远程密码"和"确认密码"处输入可以进行远程控制的密码

    ②点击"下一步"按钮,进入群集IP地址页面后再进入"端口规则"界面,点击"下一步"按钮,进入"连接"界面。



     ③在"连接"界面的"主机"栏中输入当前计算机的名称w2003-1,然后点击"连接"按钮,将在"对配置一个新的群集可用的接口"框中显示出连接的计算机的网卡及IP地址。选择与群集IP地址同一网段的地址(用于对外提供网络应用的网卡),然后点击"下一步"按钮,进入设置"主机参数"界面,点击"完成"按钮,系统将自动开始网络负载平衡群集的配置。几分钟后,网络负载平衡群集配置完成。

      ④打开第二台计算机,并以管理员的身份登录进入。

      注意:在网络负载平衡中的每个节点上,管理员账号的用户名和密码最好一致。

      ⑤然后,在第一台计算机上,用鼠标右键单击新创建的群集,从出现的菜单中选择"添加主机到群集"。将出现"连接"界面,在"主机"中输入第二台计算机的计算机名称,点击"连接"按钮,将会在"对配置群集可用的接口"下面显示出连接的计算机上的网络配置。选择202.206.197.191的网卡,进入主机参数界面,点击"完成"按钮,即可返回网络负载平衡管理器。



      ⑥关闭网络负载平衡管理器后再进入网络负载平衡管理器。用鼠标右键单击"网络负载平衡群集",从出现的菜单中选择"连接到现存的",将会弹出"连接"界面。

      输入第一台计算机的名称,点击"连接"按钮,在"群集"下面将列出群集的IP地址,选择此IP地址,并点击"完成"按钮,连接群集即可完成。

      以后,如果这两台服务器不能满足需求,可以按以上步骤添加第3台、第4台计算机到网络负载平衡中以满足要求。
    三、用IIS服务验证网络负载平衡

      网络负载平衡配置好后,为了实现某项具体的服务,需要在网络负载平衡的计算机上安装相应的服务。例如:为了实现IIS网站的负载平衡,需要在相应的网络负载平衡的计算机上安装IIS服务。

      安装网络负载平衡的应用程序时,不需要特别的方法,只需要在配置好网络负载平衡的计算机上安装相应的服务即可。但是为了让每个用户在通过网络负载平衡访问到不同的计算机时,能够访问到一致的数据,需要在网络负载平衡的每台计算机上保持数据的一致性。举例来说:实现了两个节点的IIS的网络负载平衡,为了保证两个网站内容的一致性,除了这两个IIS服务器的配置相同外,相应的网站数据必须一致。

      为了检验网络负载平衡,我们可以通过IIS来进行验证,其他的一些应用如终端服务、Windows Media服务与IIS的应用相类似。

      在网络负载平衡的每一台计算机上安装IIS服务,方法如下:

      在"添加/删除程序"中,点击"添加Windows组件",进入Windows组件向导,双击"应用程序服务器",进入"应用程序服务器"。



     选中ASP.NET、Internet信息服务及应用网络COM+访问后,即可开始安装IIS服务。

      安装之后,进入第一台计算机的inetpubwwwroot目录,新建一个文本文件,输入以下内容:

      <html>
      This win2003-1
      </html>

      然后将它保存为default.htm文件。这个网页在IE中将显示如下内容:

      This w2003-1

      在第二台计算机的inetpubwwwroot目录,新建一个文本文件,并输入下面的内容:

      <html>
      This win2003-2
      </html>

      这个网页在IE浏览器中将显示"This w2003-2",随后将这个文件以default.htm名称保存。

      然后,在其他计算机上的IE浏览器中键入http?//cluster.heinfo.edu.cn,将会显示为"This win2003-1"或"This win2003-2",根据网络的负载,网络负载平衡会自动转发到第一台计算机或第二台计算机。为了验证效果,你可以在浏览的时候,拔掉第一台计算机的网线或拔掉第二台机器的网线,将会发现浏览到的将是不同内容。当然,我们只是测试的时候,为了验证网络负载平衡的效果,两个网站的内容不一致,而在正式应用的时候,网络负载平衡群集的每个节点计算机的内容将是一致的,这样,不管使用那一个节点响应,都保证访问的内容是一致的。

    August 09

    asp.net将图片上传并存入SqlServer中

    一,上传并存入SqlServer
     数据库结构
      create table test
      {
         id identity(1,1),
         FImage image
      }
      相关的存储过程
      Create proc UpdateImage
      (
         @UpdateImage Image
      )
      As
      Insert Into test(FImage) values(@UpdateImage)
      GO
    在UpPhoto.aspx文件中添加如下:
    <input id="UpPhoto" name="UpPhoto" runat="server" type="file">
    <asp:Button id="btnAdd" name="btnAdd" runat="server" Text="上传"></asp:Button>

    然后在后置代码文件UpPhoto.aspx.cs添加btnAdd按钮的单击事件处理代码:
    private void btnAdd_Click(object sender, System.EventArgs e)
    {
            //获得图象并把图象转换为byte[]
            HttpPostedFile upPhoto=UpPhoto.PostedFile;
            int upPhotoLength=upPhoto.ContentLength;
            byte[] PhotoArray=new Byte[upPhotoLength];
            Stream PhotoStream=upPhoto.InputStream;
            PhotoStream.Read(PhotoArray,0,upPhotoLength);

            //连接数据库
            SqlConnection conn=new SqlConnection();
            conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa";

            SqlCommand cmd=new SqlCommand("UpdateImage",conn);
            cmd.CommandType=CommandType.StoredProcedure;

            cmd.Parameters.Add("@UpdateImage",SqlDbType.Image);
            cmd.Parameters["@UpdateImage"].Value=PhotoArray;

            //如果你希望不使用存储过程来添加图片把上面四句代码改为:
            //string strSql="Insert into test(FImage) values(@FImage)";
            //SqlCommand cmd=new SqlCommand(strSql,conn);
            //cmd.Parameters.Add("@FImage",SqlDbType.Image);
            //cmd.Parameters["@FImage"].Value=PhotoArray;

     conn.Open();
     cmd.ExecuteNonQuery();
     conn.Close();
    }

    二,从SqlServer中读取并显示出来
    在需要显示图片的地方添加如下代码:
    <asp:image id="imgPhoto" runat="server" ImageUrl="ShowPhoto.aspx"></asp:image>

    ShowPhoto.aspx主体代码:
    private void Page_Load(object sender, System.EventArgs e)
    {
         if(!Page.IsPostBack)
         {
                    SqlConnection conn=new SqlConnection()
                    conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa";
                   
                    string strSql="select * from test where id=2";//这里假设获取id为2的图片
                    SqlCommand cmd=new SqlCommand()
                    reader.Read();
                    Response.ContentType="application/octet-stream";
                    Response.BinaryWrite((Byte[])reader["FImage"]);
                    Response.End();
                    reader.Close();
         }
    }


    3,在winform中将图片存入sqlserver,并从sqlserver中读取并显示在picturebox中

    1,存入sqlserver
    数据库结构和使用的存储过过程,同上面的一样
     1.1,在窗体中加一个OpenFileDialog控件,命名为ofdSelectPic
     1.2,在窗体上添加一个打开文件按钮,添加如下单击事件代码:
        Stream ms;
      byte[] picbyte;
      //ofdSelectPic.ShowDialog();
      if (ofdSelectPic.ShowDialog()==DialogResult.OK)
      {
       if ((ms=ofdSelectPic.OpenFile())!=null)
       {
        //MessageBox.Show("ok");
        picbyte=new byte[ms.Length];
        ms.Position=0;
        ms.Read(picbyte,0,Convert.ToInt32(ms.Length));
        //MessageBox.Show("读取完毕!");

        //连接数据库
        SqlConnection conn=new SqlConnection();
        conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa";

        SqlCommand cmd=new SqlCommand("UpdateImage",conn);
        cmd.CommandType=CommandType.StoredProcedure;

        cmd.Parameters.Add("@UpdateImage",SqlDbType.Image);
        cmd.Parameters["@UpdateImage"].Value=picbyte;

        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();

        ms.Close();
        }
       }

    2,读取并显示在picturebox中
     2.1 添加一个picturebox,名为ptbShow
     2.2 添加一个按钮,添加如下响应事件:
          SqlConnection conn=new SqlConnection();
     conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa";

     string strSql="select FImage from test where id=1";

     SqlCommand cmd=new SqlCommand(strSql,conn);

     conn.Open();
     SqlDataReader reader=cmd.ExecuteReader();
            reader.Read();

     MemoryStream ms=new MemoryStream((byte[])reader["FImage"]);


     Image image=Image.FromStream(ms,true);

            reader.Close();
            conn.Close();

     ptbShow.Image=image;


    在UpPhoto.aspx文件中添加如下:
    <input id="UpPhoto" name="UpPhoto" runat="server" type="file">
    <asp:Button id="btnAdd" name="btnAdd" runat="server" Text="上传"></asp:Button>

    然后在后置代码文件UpPhoto.aspx.cs添加btnAdd按钮的单击事件处理代码:
    private void btnAdd_Click(object sender, System.EventArgs e)
    {
            //获得图象并把图象转换为byte[]
            HttpPostedFile upPhoto=UpPhoto.PostedFile;
            int upPhotoLength=upPhoto.ContentLength;
            byte[] PhotoArray=new Byte[upPhotoLength];
            Stream PhotoStream=upPhoto.InputStream;
            PhotoStream.Read(PhotoArray,0,upPhotoLength);

            //连接数据库
            SqlConnection conn=new SqlConnection();
            conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa";

            SqlCommand cmd=new SqlCommand("UpdateImage",conn);
            cmd.CommandType=CommandType.StoredProcedure;

            cmd.Parameters.Add("@UpdateImage",SqlDbType.Image);
            cmd.Parameters["@UpdateImage"].Value=PhotoArray;

            //如果你希望不使用存储过程来添加图片把上面四句代码改为:
            //string strSql="Insert into test(FImage) values(@FImage)";
            //SqlCommand cmd=new SqlCommand(strSql,conn);
            //cmd.Parameters.Add("@FImage",SqlDbType.Image);
            //cmd.Parameters["@FImage"].Value=PhotoArray;

     conn.Open();
     cmd.ExecuteNonQuery();
     conn.Close();
    }

    二,从SqlServer中读取并显示出来
    在需要显示图片的地方添加如下代码:
    <asp:image id="imgPhoto" runat="server" ImageUrl="ShowPhoto.aspx"></asp:image>

    ShowPhoto.aspx主体代码:
    private void Page_Load(object sender, System.EventArgs e)
    {
         if(!Page.IsPostBack)
         {
                    SqlConnection conn=new SqlConnection()
                    conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa";
                   
                    string strSql="select * from test where id=2";//这里假设获取id为2的图片
                    SqlCommand cmd=new SqlCommand()
                    reader.Read();
                    Response.ContentType="application/octet-stream";
                    Response.BinaryWrite((Byte[])reader["FImage"]);
                    Response.End();
                    reader.Close();
         }
    }


    3,在winform中将图片存入sqlserver,并从sqlserver中读取并显示在picturebox中

    1,存入sqlserver
    数据库结构和使用的存储过过程,同上面的一样
     1.1,在窗体中加一个OpenFileDialog控件,命名为ofdSelectPic
     1.2,在窗体上添加一个打开文件按钮,添加如下单击事件代码:
        Stream ms;
      byte[] picbyte;
      //ofdSelectPic.ShowDialog();
      if (ofdSelectPic.ShowDialog()==DialogResult.OK)
      {
       if ((ms=ofdSelectPic.OpenFile())!=null)
       {
        //MessageBox.Show("ok");
        picbyte=new byte[ms.Length];
        ms.Position=0;
        ms.Read(picbyte,0,Convert.ToInt32(ms.Length));
        //MessageBox.Show("读取完毕!");

        //连接数据库
        SqlConnection conn=new SqlConnection();
        conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa";

        SqlCommand cmd=new SqlCommand("UpdateImage",conn);
        cmd.CommandType=CommandType.StoredProcedure;

        cmd.Parameters.Add("@UpdateImage",SqlDbType.Image);
        cmd.Parameters["@UpdateImage"].Value=picbyte;

        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();

        ms.Close();
        }
       }

    2,读取并显示在picturebox中
     2.1 添加一个picturebox,名为ptbShow
     2.2 添加一个按钮,添加如下响应事件:
          SqlConnection conn=new SqlConnection();
     conn.ConnectionString="Data Source=localhost;Database=test;User Id=sa;Pwd=sa";

     string strSql="select FImage from test where id=1";

     SqlCommand cmd=new SqlCommand(strSql,conn);

     conn.Open();
     SqlDataReader reader=cmd.ExecuteReader();
            reader.Read();

     MemoryStream ms=new MemoryStream((byte[])reader["FImage"]);


     Image image=Image.FromStream(ms,true);

            reader.Close();
            conn.Close();

     ptbShow.Image=image;

    javascript用回车键实现Tab键功能

    我前段时间看了MS的ASP.NET讲座,在里面谈到了如何让"回车键"使文本框的焦点一个个下移.其中提了三种方法,最好的一种是这样的:

     用客户端脚本在页面添加document的onkeydown事件,让页面在接受到回车事件后,进行Tab键的功能,即只要把event的keyCode由13变为9

     VBScript代码:

     <script language="vbscript">

     sub document_onkeydown

        if event.keyCode=13 then

          event.keyCode=9

       end if

     end sub

    </script>

    Javascript代码如下:

    <script language="javascript" for="document" event="onkeydown">

    <!--

      if(event.keyCode==13)

         event.keyCode=9;

    -->

    </script>

    这样的处理方式,可以实现焦点往下移动,但对于按钮也起同样的作用,一般的客户在输入完资料以后,跳到按钮后,最好能直接按"回车"进行数据的提交.因此,对上面的方法要进行一下修改,应该对于"提交"按钮不进行焦点转移.而直接激活提交.

     

    因此我对上面的代码进行了一个修改,即判断事件的"源",是否为提交按钮,代码如下:

    <script language="javascript" for="document" event="onkeydown">

    <!--

      if(event.keyCode==13 && event.srcElement.type!='button' && event.srcElement.type!='submit' && event.srcElement.type!='reset' && event.srcElement.type!='textarea' && event.srcElement.type!='')

         event.keyCode=9;

    -->

    </script>

    判断是否为button, 是因为在HTML上会有type="button"

    判断是否为submit,是因为HTML上会有type="submit"

    判断是否为reset,是因为HTML上的"重置"应该要被执行

    判断是否为空,是因为对于HTML上的"<a>链接"也应该被执行,这种情况发生的情况不多,可以使用"tabindex=-1"的方式来取消链接获得焦点.


    August 01

    C#格式化


    C#格式化数值结果表

    字符

    说明

    示例

    输出

    C 货币 string.Format("{0:C3}", 2) $2.000
    D 十进制 string.Format("{0:D3}", 2) 002
    E 科学计数法 1.20E+001 1.20E+001
    G 常规 string.Format("{0:G}", 2) 2
    N 用分号隔开的数字 string.Format("{0:N}", 250000) 250,000.00
    X 十六进制 string.Format("{0:X000}", 12) C


    string.Format("{0:000.000}", 12.2) 012.200

    Strings

    There really isn't any formatting within a strong, beyond it's alignment. Alignment works for any argument being printed in a String.Format call.

     

    Sample Generates
    String.Format("->{1,10}<-", "Hello"); -> Hello<-
    String.Format("->{1,-10}<-", "Hello"); ->Hello <-

    Numbers

    Basic number formatting specifiers:

     

    Specifier Type Format

    Output
    (Passed
    Double 1.42)

    Output
    (Passed
    Int -12400)

    c Currency {0:c} $1.42 -$12,400
    d Decimal (Whole number) {0:d} System.
    FormatException
    -12400
    e Scientific {0:e} 1.420000e+000 -1.240000e+004
    f Fixed point {0:f} 1.42 -12400.00
    g General {0:g} 1.42 -12400
    n Number with commas for thousands {0:n} 1.42 -12,400
    r Round trippable {0:r} 1.42 System.
    FormatException
    x Hexadecimal {0:x4} System.
    FormatException
    cf90

    Custom number formatting:

     

    Specifier Type Example Output (Passed Double 1500.42) Note
    0 Zero placeholder {0:00.0000} 1500.4200 Pads with zeroes.
    # Digit placeholder {0:(#).##} (1500).42
    . Decimal point {0:0.0} 1500.4
    , Thousand separator {0:0,0} 1,500 Must be between two zeroes.
    ,. Number scaling {0:0,.} 2 Comma adjacent to Period scales by 1000.
    % Percent {0:0%} 150042% Multiplies by 100, adds % sign.
    e Exponent placeholder {0:00e+0} 15e+2 Many exponent formats available.
    ; Group separator see below  

    The group separator is especially useful for formatting currency values which require that negative values be enclosed in parentheses. This currency formatting example at the bottom of this document makes it obvious:

    Dates

    Note that date formatting is especially dependant on the system's regional settings; the example strings here are from my local locale.

     

    Specifier Type Example (Passed System.DateTime.Now)
    d Short date 10/12/2002
    D Long date December 10, 2002
    t Short time 10:11 PM
    T Long time 10:11:29 PM
    f Full date & time December 10, 2002 10:11 PM
    F Full date & time (long) December 10, 2002 10:11:29 PM
    g Default date & time 10/12/2002 10:11 PM
    G Default date & time (long) 10/12/2002 10:11:29 PM
    M Month day pattern December 10
    r RFC1123 date string Tue, 10 Dec 2002 22:11:29 GMT
    s Sortable date string 2002-12-10T22:11:29
    u Universal sortable, local time 2002-12-10 22:13:50Z
    U Universal sortable, GMT December 11, 2002 3:13:50 AM
    Y Year month pattern December, 2002

    The 'U' specifier seems broken; that string certainly isn't sortable.

    Custom date formatting:

     

    Specifier Type Example Example Output
    dd Day {0:dd} 10
    ddd Day name {0:ddd} Tue
    dddd Full day name {0:dddd} Tuesday
    f, ff, ... Second fractions {0:fff} 932
    gg, ... Era {0:gg} A.D.
    hh 2 digit hour {0:hh} 10
    HH 2 digit hour, 24hr format {0:HH} 22
    mm Minute 00-59 {0:mm} 38
    MM Month 01-12 {0:MM} 12
    MMM Month abbreviation {0:MMM} Dec
    MMMM Full month name {0:MMMM} December
    ss Seconds 00-59 {0:ss} 46
    tt AM or PM {0:tt} PM
    yy Year, 2 digits {0:yy} 02
    yyyy Year {0:yyyy} 2002
    zz Timezone offset, 2 digits {0:zz} -05
    zzz Full timezone offset {0:zzz} -05:00
    : Separator {0:hh:mm:ss} 10:43:20
    / Separator {0:dd/MM/yyyy} 10/12/2002

    Enumerations

     

    Specifier Type
    g Default (Flag names if available, otherwise decimal)
    f Flags always
    d Integer always
    x Eight digit hex.

    Some Useful Examples

    String.Format("{0:$#,##0.00;($#,##0.00);Zero}", value);

    This will output "$1,240.00" if passed 1243.50. It will output the same format but in parentheses if the number is negative, and will output the string "Zero" if the number is zero.

    String.Format("{0:(###) ###-####}", 18005551212);

    This will output "(800) 555-1212".

     

    变量.ToString()


    字符型转换 转为字符串
    12345.ToString("n"); //生成 12,345.00
    12345.ToString("C"); //生成 ¥12,345.00
    12345.ToString("e"); //生成 1.234500e+004
    12345.ToString("f4"); //生成 12345.0000
    12345.ToString("x"); //生成 3039 (16进制)
    12345.ToString("p"); //生成 1,234,500.00%

    June 12

    Visual Studio.NET快捷键

    Visual Studio.NET快捷键

    [ 2005-07-12 17:28:51 | 作者: admin ]
    字体大小: | |

    Keys

    图示和解释

    "> command" in Mini-buffer

    可以在这个窗体中执行一些命令比如关闭当前窗口等等

    Ctrl-Shift-G in mini-buffer
    Ctrl-O in mini-buffer

    Ctrl-Shift-G 将打开objects.cs 这个文件 Ctrl-O 打开Open对话框

    Ctrl-Tab

    Ctrl-Shift-Tab

    Ctrl-Tab:切换当前的编辑视图,Ctrl-Shift-Tab:按反方向切换

    Ctrl+/

    + 焦点跳动Mini-buffer,并且出现>”命令提示符

    Ctrl-PageUp in HTML Design View

    + 在ASP.NET Project中,打开HTML视

    Ctrl-PageDown in HTML Source View

    + 在ASP.NET Project中 ,打开到 Design 视

    F7 in Form Design View

    + 打开代码编辑视 source view

    Shift-F7 in Form Source View

    + 打开窗体设计视design view

    Alt-F6

    + 切换到下一个可显示的面板,并自动的从一个Tab跳到另一个Tab

    Ctrl-Shift-B

    Build 你的代码或Project

    F5

    Ctrl-F5

    F5 : 运行在Debug模式Ctrl-F5: 直接运行,但不在debug模式,忽视断点

    F11

    F10

    F11:Debug时,进入正在调用的某个函数F10:Debug时,将不进入具体的函数

    Ctrl-B

    Ctrl-Shift-F9

    Ctrl-Alt-B

    Ctrl-B:设置或取消当前行的断点Ctrl-Shift-F9:取所有消断点

    Ctrl-Alt-B :激活断点列表,调试时特别方便

    F8

    Shift-F8

    + 在编译错误View进行导航上一个或下一个

    Ctrl-Space when typing a symbol

    + 出现可能的选项,中文系统中这个按键经常和切换输入法冲突

    Ctrl-Space when entering arguments

    + 键入函数参数时按可以显示函数参数的原型

    Ctrl-K Ctrl-F

    + 将不规则的文本重新格式化

    Ctrl-K Ctrl-K

    Ctrl-K Ctrl-N

    Ctrl-K Ctrl-P

     

    Ctrl-K Ctrl-K:定义和取消一个书签

    Ctrl-K Ctrl-N:切换到下一个书签 Ctrl-K Ctrl-P:切换到前一个书签

    Ctrl-K Ctrl-C

    + 将选中的代码行注释

    Ctrl-K Ctrl-U

    将已经选中的代码行的注释去掉

    Ctrl-}

    + 匹配 {} ,() 等成对标示符号

    Shift-Ctrl-}

    + 将匹配的{}, () 之间的数据选中

    Ctrl-L or Ctrl-Y or Shift-Del

    + 删除光标所在的整行

    Ctrl-Shift-F12

    + 在下一个搜寻的结果,下一个错误,下一个任务(task)

    Ctrl-"-"/Ctrl-Shift-"-"

     

    Ctrl-"-" :将编辑光标跳动最后一次你工作过的地方

    Ctrl-Shift-"-" :跳动你目前位置的下一个位置(这些位置都是你曾经工作过的地方)

    Ctrl-C in the Class View

    + 拷贝这个全名到内存,比如上面图中加入Project是MyTest,那么内存中的全面将是MyTest.WebForm1.Page_Load,写代码时这个功能很方便,不断Ctrl-V

    Ctrl-M Ctrl-M

    + 收缩或扩展代码编辑视中的region 或 outlined 块

    Ctrl-M Ctrl-O

    + 收缩当前文档中的所有节点

    Ctrl-M Ctrl-L

    + 扩展开当前文件中所有的节点

    F12

    + 跳动函数或当前标示的定义,相当于上述菜单中的Go to Definition

    Ctrl-G, line #, Enter

    Ctrl-D, line #, Ctrl-G

    + 快速跳动代码编辑器某行

    Ctrl-I/Ctrl-Shift-I + string

    + 增加目前要搜寻字符串,相对与目前搜寻的二次搜寻

    + 上述功能的反方向的操作

    + 执行这两个操作时,你可以看到界面上有一个很特别的箭头图标,两种操作分别对应不同方向的搜寻

    Ctrl-R+Ctrl-R

    + 打开或关上代码编辑器的 word wrap 功能

    Ctrl-Alt-L

    + 切换到Solution Explorer

    F4 or Alt-Enter

    + 切换到属性窗口的默认选择项或之前的一个已选项

    Ctrl-Alt-X

    + 打开 ToolBox

    Ctrl-Alt-S

    + 打开 Server Explorer

    Ctrl-Alt-J

    + 打开Object Browser

    Ctrl-Shift-C

    + 打开Class View

    还不够,那么在选项中选中这个检查框,那么你可以看到更多

    + 选中Optiong选项,然后选中 Show shortcut keys in ScreenTips 这个选项

    正则表达式小结

    正则表达式小结

    [ 2005-07-16 10:22:54 | 作者: admin ]
    字体大小: | |
    配中文字符的正则表达式: [\u4e00-\u9fa5]

    匹配双字节字符(包括汉字在内):[^\x00-\xff]

    应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

    String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

    匹配空行的正则表达式:\n[\s| ]*\r

    匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

    匹配首尾空格的正则表达式:(^\s*)|(\s*$)

    利用正则表达式限制网页表单里的文本框输入内容:

    用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

    用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

    用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

    用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

    正则表达式,相关链接
    http://blog.csdn.net/laily/category/19548.aspx
    http://blog.csdn.net/laily/archive/2004/06/30/30525.aspx 微软的正则表达式教程(五):选择/编组和后向引用

    http://blog.csdn.net/laily/archive/2004/06/30/30522.aspx 微软的正则表达式教程(四):限定符和定位符

    http://blog.csdn.net/laily/archive/2004/06/30/30517.aspx 微软的正则表达式教程(三):字符匹配

    http://blog.csdn.net/laily/archive/2004/06/30/30514.aspx 微软的正则表达式教程(二):正则表达式语法和优先权顺序

    http://blog.csdn.net/laily/archive/2004/06/30/30511.aspx 微软的正则表达式教程(一):正则表达式简介

    http://blog.csdn.net/laily/archive/2004/06/30/30360.aspx 小程序大作为:高级查找/替换、正则表达式练习器、Javascript脚本程序调试器

    "^\d+$"  //非负整数(正整数 + 0)
    "^[0-9]*[1-9][0-9]*$"  //正整数
    "^((-\d+)|(0+))$"  //非正整数(负整数 + 0)
    "^-[0-9]*[1-9][0-9]*$"  //负整数
    "^-?\d+$"    //整数
    "^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0)
    "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
    "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0)
    "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
    "^(-?\d+)(\.\d+)?$"  //浮点数
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
    "^\w+$"  //由数字、26个英文字母或者下划线组成的字符串
    "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址
    "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url
    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日
    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年
    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil
    "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码
    "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址

    ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ //MAC地址的正则表达式
    ^[-+]?\d+(\.\d+)?$ //值类型正则表达式

    "^\\d+$"  //非负整数(正整数 + 0)
    "^[0-9]*[1-9][0-9]*$"  //正整数
    "^((-\\d+)|(0+))$"  //非正整数(负整数 + 0)
    "^-[0-9]*[1-9][0-9]*$"  //负整数
    "^-?\\d+$"    //整数
    "^\\d+(\\.\\d+)?$"  //非负浮点数(正浮点数 + 0)
    "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
    "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮点数(负浮点数 + 0)
    "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
    "^(-?\\d+)(\\.\\d+)?$"  //浮点数
    ^[0-9A-Za-z_ ]+(.[jJ][pP][gG]|.[gG][iI][fF])$ //上传文件格式只能是.gif或.jpg
    ^(((19)|(20))\d{2})(((((-|/)0?)|0)[1-9])|((-|/)?1[0-2]))((((((-|/)0?)|0)[1-9])|((-|/)?[1-2][0-9]))|((-|/)?3[0-1]))$ //日期格式判断
    ^[\u4E00-\u9FA5]*$ //任意中文
    [^'^“^”^\^!^@^#^$^%^\^^&^*^(^)^<^>^《^》^?^。^,^?^¥^\{^\}^\][^\]]{2,} //图片标题至少2个字符,不应包含'“ ” ! @ # $ % ^ & * ( ) < > 《 》{ } [ ] ? 。,? ¥

    asp.net 正确获取当前URL

    获取当前URL我一直使用HttpContext.Current.Request.Url.ToString(),今天Tinyfool指出我的一个Bug,调试发现,ToString()函数并不可靠。

    如果当前URL为
    http://localhost/search.aspx?user=tinyfool&tag=%BC%BC%CA%F5
    通过HttpContext.Current.Request.Url.ToString()获取到的却是
    http://localhost/search.aspx?user=tinyfool&tag=¼¼Êõ
    这显然不对,怎么办?用HttpContext.Current.Request.Url.PathAndQuery好了,这个得到的正确的。:)
    June 09

    保存页面

    function savePage(text)
    {
     if(document.queryCommandEnabled('saveAS'))  {
             var para = 'toolbar=0,titlebar=0,menubar=0,resizable=0,Height=7,Width=8,status=0,top=2000,left=2000,scrollbars=0';
             win=open('about:blank','',para);
             win.charset='GB2312';
             win.document.write(text);
             win.document.execCommand('SaveAs',true,'data.htm');
             win.close();
       }    
    }

    function savePageASxls(text,title)
    {
     if(document.queryCommandEnabled('saveAS'))  {
             var para = 'toolbar=0,titlebar=0,menubar=0,resizable=0,Height=7,Width=8,status=0,top=2000,left=2000,scrollbars=0';
             win=open('about:blank','',para);
             win.charset='GB2312';
             win.document.write(text);
             win.document.execCommand('SaveAs',true,title + '.xls');
             win.close();
       }    
    }
    June 06

    双击复制下面当前页面地址,发送给朋友!


      <script>
       function copyCode(o){o.select();var js=o.createTextRange();js.execCommand("Copy");alert("复制成功!");}   
       document.write("<textarea onfocus=this.select() style='width:88%;overflow-y:visible;' ondblclick=copyCode(this) rows=1>");
       document.write(self.location+"</textarea>");   
       </script>
    May 28

    常用正则表达式

    "^\d+$"  //非负整数(正整数 + 0) 
    "^[0-9]*[1-9][0-9]*$"  //正整数 
    "^((-\d+)|(0+))$"  //非正整数(负整数 + 0) 
    "^-[0-9]*[1-9][0-9]*$"  //负整数 
    "^-?\d+$"    //整数 
    "^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0) 
    "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 
    "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0) 
    "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 
    "^(-?\d+)(\.\d+)?$"  //浮点数 
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串 
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串 
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 
    "^\w+$"  //由数字、26个英文字母或者下划线组成的字符串 
    "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 
    "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url
       /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日
       /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年
    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil
    "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"     //电话号码
    "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址

    首先引入命名空间
    using System.Text.RegularExpressions;
    验证代码:
    if(!Regex.IsMatch(dr[8].ToString().Trim(), "^[0-9]+(.[0-9]*)?$"))//正则表达式
         {
          Err+="导入第"+i+"行出错,产品数量格式不正确!";
         }
         else
         {
          dr[8] =Convert.ToInt32(double.Parse(dr[8].ToString().Trim()));//将数据转换为Int型保存回去
         }

    May 24

    网页快捷键accesskey

    刚刚看到了一个网站上讲用accesskey可以定义一个快捷键,比如下面语法:

    <a href="/" accesskey="H"><span class="underline">H</span>ome</a>

    span的underline class是为了让H下面出现一个下划线,是我自己定义的。这样你的网页就能看到:Home 这样的效果了,当你按下alt+H时,会发现一个虚框出现在Home的周围了,也就是说此时的focus时落在这里了,按下enter或sapce都可以相当于点击它了,对于残疾人可以起到很大的帮助作用

    accesskey的优先级是最高点 ,可以屏蔽掉浏览器的快捷键。但是在没有这种的accesskey的网页上你按下alt+H是什么结果呢?可以看到的是“帮助”啊!自己站上的东西千万不要和IE等的工具冲突。这里列举一下默认&组合:
    IE: A(favorites) D(address) E(edit) F(file) H(help) T(tools) V(view)
    FireFox:B(bookmark) D(address) E(edit) F(file) G(goto) H(help) T(tools) V(view)
    May 15

    如何下载网页?

    如何下载网页?首先使用 System.Net.WebRequestFactory 类来获得一个 WebRequest 对象: WebRequest request = WebRequestFactory.Create( "http://localhost" ); 然后请求应答: WebResponse response = request.GetResponse(); GetResponse 方法被阻塞直到下载完成。然后你能像下面那样访问应答流: Stream s = response.GetResponseStream(); // Output the downloaded stream to the console StreamReader sr = new StreamReader( s ); string line; while( (line = sr.ReadLine()) != null ) Console.WriteLine( line ); 注意 WebRequest 和 WebReponse 对象分别向下兼容 HttpWebRequest 和 HttpWebReponse 对象,它们被用来访问和 http 相关的功能。 如何使用代理服务器 (proxy)?两种—这样做以便影响所有 Web 请求: System.Net.GlobalProxySelection.Select = new DefaultControlObject( "proxyname", 80 ); 另外一种,要想对特定的 Web 请求设置代理服务,这样做: ProxyData proxyData = new ProxyData(); proxyData.HostName = "proxyname"; proxyData.Port = 80; proxyData.OverrideSelectProxy = true; HttpWebRequest request = (HttpWebRequest)WebRequestFactory.Create( "http://localhost" ); request.Proxy = proxyData;
    April 28

    开源项目网址

     

    SharpZipLib http://www.icsharpcode.net/OpenSource/SharpZipLib   C#
    Spring.NET http://www.springframework.net http://sourceforge.net/projects/springnet/ C#
    NHibernate http://www.nhibernate.org/ http://sourceforge.net/projects/nhibernate/ C#
    log4net http://logging.apache.org/log4net/ http://sourceforge.net/projects/log4net/ C#
    iBATIS.NET http://ibatis.apache.org/ http://sourceforge.net/projects/ibatisnet/ C#
    Ajax.NET http://www.schwarz-interactive.de/ http://weblogs.asp.net/mschwarz/ C#
    NAnt http://nant.sourceforge.net/ C#
    NUnit http://www.nunit.org/ http://sourceforge.net/projects/nunit C#
    Cuyahoga http://www.cuyahoga-project.org/ C#
    NDoc http://ndoc.sourceforge.net/ http://sourceforge.net/projects/ndoc C#
    Rainbow http://www.rainbowportal.net/ http://sourceforge.net/projects/rainbowportal/ C#
    Community Server http://communityserver.org/ C#
    FCKeditor http://www.fckeditor.net/ http://sourceforge.net/projects/fckeditor/ C#
    patterns & practices: Enterprise Library http://www.gotdotnet.com/codegallery/codegallery.aspx?id=295a464a-6072-4e25-94e2-91be63527327 C#
    ZedGraph http://zedgraph.sourceforge.net/ http://sourceforge.net/projects/zedgraph/ C#
    iTextSharp http://itextsharp.sourceforge.net/ http://sourceforge.net/projects/itextsharp/ C#
    dotLucene http://sourceforge.net/projects/dotlucene/ C#
    DotNetNuke http://www.dotnetnuke.com/ C#
    The Netron Project http://www.netronproject.com/ http://sourceforge.net/projects/netron C#
    DotNetTools workflow http://www.gotdotnet.com/workspaces/workspace.aspx?id=6666274d-a3e5-4e7b-b0cb-368dbb2c4bca C#
    MagicAjax.NET http://www.magicajax.net/ C#
    Magic Library http://www.dotnetmagic.com/ C#
    Flex Wiki http://www.flexwiki.com/ http://sourceforge.net/projects/flexwiki/ C#
    MasterPages http://www.metabuilders.com/Tools/MasterPages.aspx C#
    BlueWhaleCRM http://www.bluewhalecrm.com/ http://sourceforge.net/projects/bluewhalecrm/ C#
    Castle http://www.castleproject.org/ C#
    skmFAQs.NET http://skmfaqs.net/skmFAQs/ C#
    MyTreeView http://www.funkelab.com/website.aspx?displayid=1216 C#
    MyListView http://www.funkelab.com/website.aspx?displayid=1157 C#
    SushiWiki http://sourceforge.net/projects/sushiwiki/


    ASP.Net中让网页“立即过时”

     
    让网页“立即过时”有时候是一个很有用的功能,比如防止用户使用后退来破坏程序逻辑;程序主动刷新某个页面等等。

    第一种方法:
    在ASP.NET中使用下面的语句就能实现这个功能。 
             
    Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);  

    备注:这种方法似乎只有IE的结果是对的,Firefox好像不行。。。。。。

    第二种支持所有浏览器的方法:
    在页面中添加如下代码:

    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">             
    <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> 
    <META HTTP-EQUIV="Expires" CONTENT="-1">                       


    更多信息可以参考:
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;234067

    弹出的窗口之定时关闭控制

    【弹出的窗口之定时关闭控制】
    下面我们再对弹出窗口进行【弹出的窗口之定时关闭控制】
    下面我们再对弹出窗口进行一些控制,效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主页面中,否则…),让它在10秒钟后自动关闭是不是更酷了?
    首先,将如下代码加入page.html文件的<head>区:
    <script language="javascript">
    function closeit() {
    setTimeout("self.close()",10000) file://毫秒
    }
    </script>
    然后,再用<body onload="closeit()">这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,10秒钟后就自行关闭该窗口。)
    一些控制,效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主页面中,否则…),让它在10秒钟后自动关闭是不是更酷了?
    首先,将如下代码加入page.html文件的<head>区:
    <script language="javascript">
    function closeit() {
    setTimeout("self.close()",10000) file://毫秒
    }
    </script>
    然后,再用<body onload="closeit()">这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,10秒钟后就自行关闭该窗口。)
    April 24

    javascript:类型转换

    "javascript:类型转换"

    在表达式中使用变量时,JavaScript会自动地将一种类型值变成另一种类型。也就是说在表达式中可有不同类型的数据组合,JavaScript在运算时完成使表达式有意义所必需的类型转换。在JavaScript中类型的转换是按其运算的优先级进行的,一般来说,字符串运算的优先级较高,然后依次是浮点运算、整型运算和逻辑运算。

    例如:表达式"test"+5,先将数字5转换成字符串"5",并附加到字符串"test"后面,结果为"test"+5

    注意:所有情况下,非字符串运算符使用字符串运算时,JavaScript都将其运算符转变成字符串:
    * 数字值转换为相应的字符串值。
    * 布尔值转换为1和0以支持数字运算。
    * null值变成字符串运算的"null"或布尔false或数字运算0。

    ========================================
    函数(Function)是进行特定任务的一组JavaScript代码,通常返回一个值。函数可能没有参数或有多个参数。参数指定函数要处理的数据。

    JavaScript提供了3个显式的类型转换函数,分别是eval()、parseInt()和parseFloat()。

    eval()函数:将字符串表达式转换成数字值。例如,语句total=eval("432.1*10")的结果是total=4321即将数值4321赋予total变量。

    parseInt()函数:把字符串转换成整数。返回是从字符串的第一个字符开始,如果字符不是以整数开头则返回0。parseInt()函数还可以转换十六进制数或十进制数。

    例如:parseInt("123xyz") 返回123,而parseInt("xyz")返回0。

    parseFloat()函数:类似于parseInt()函数,它返回字符串上包含的第一个浮点数。如果字符串不以有效浮点数开头,则返回0。

    例如:parseFloat("2.1e4xyz")返回21000;而parseFloat("xyz")返回0。
    December 28

    如何在传统 ASP 和 ASP.NET 之间共享会话状态

    简介

    Microsoft ASP.NET 是最新的 Microsoft 技术,用于开发基于 Web 的应用程序。相比传统的 ASP 脚本技术而言,它具有很多优点,其中包括:1) 将 UI 表示形式从业务逻辑中分离出来,从而提供更好的开发结构; 2) 其代码是完全编译的,而在传统 ASP 中代码是解释的;和 3) 其编译特性结合其高速缓存支持,就意味着相对用传统 ASP 编写的等效站点而言,使用 ASP.NET 编写的站点的性能有显著提高。

    尽管将现有的 ASP 应用程序转换到 ASP.NET 具有潜在的益处,但很多现有的 ASP 应用程序都具有关键的使命并且是相当复杂的。这种转换过程可能需要大量资源,并可能给现有的应用程序带来额外的风险。要解决这些问题,一种方法就是同时运行 ASP 和 ASP.NET,并一次只将应用程序的一部分转换为 ASP.NET。为了同时运行新的和旧的应用程序,就需要一种机制在传统 ASP 和 ASP.NET 之间共享会话状态。在本文中,我将讨论如何利用 Microsoft.NET 框架的若干类和序列化特性来共享这些会话状态。

    概念综述

    Cookie 是 Web 应用程序用来标识用户会话的最常用方法,可供传统 ASP 和 ASP.NET 二者用来标识会话状态。而用 ASP 脚本将会话状态信息存储在内存中,且不能与其他应用程序(如 ASP.NET)共享。如果会话状态以一种通用格式存储在 Microsoft SQL Server 中,则传统的 ASP 和 ASP.NET 都能访问会话状态。

    在此示例中,使用了一个名为 mySession 的 cookie 来标识用户会话。当用户向 Web 应用程序发出请求时,该用户将被发放一个唯一的 cookie 以便标识该会话。在后续的请求中,浏览器将该唯一的 cookie 发送回服务器以标识该会话。在加载所请求的 Web 页面之前,一个自定义的对象将利用该唯一 cookie 从 SQL Server 中重新加载用户会话数据。在 Web 页面中通过该自定义的对象即可访问会话状态。在 Web 请求结束后,随着该请求的终止,会话数据将被保存回 SQL Server 中(参见图 1)。


    1. 示例数据流

    ASP.NET 实现

    在 ASP.NET 中,每个 Web 页面都是从 System.Web.UI.Page 类派生出来的。Page 类中包含 HttpSession 对象的一个实例以用于会话数据。在本示例中,从 System.Web.UI.Page 派生了一个名为 SessionPage 的自定义 Page 类,以实现与 Page 类完全相同的各种特性。派生页的唯一不同之处就是利用一个自定义的会话对象重写了默认的 HttpSession。(利用实例变量的 new 修饰符,C# 允许派生类隐藏基类的成员。)

       public class SessionPage : System.Web.UI.Page 
       { 
          ... 
          public new mySession Session = null; 
          ... 
       } 
    

    自定义的会话类负责利用 HybridDictionary 对象将会话状态存储到内存中。(HybridDictionary 能够高效地处理任何数量的会话元素。)为了实现与传统 ASP 之间的互操作性,该自定义的会话类将会话数据类型限定为仅允许字符串型。(默认的 HttpSession 允许将任何类型的数据存储在会话中,而这将不能与传统 ASP 互操作。)

       [Serializable] 
    public class mySession  
       { 
          private HybridDictionary dic = new HybridDictionary(); 
          public mySession() 
          { 
          } 
          public string this [string name] 
          { 
             get 
             { 
                return (string)dic[name.ToLower()]; 
             } 
             set 
             { 
                dic[name.ToLower()] = value; 
             } 
          } 
       } 
    

    Page 类公开不同的事件和方法以供进行自定义。特别地,OnInit 方法用于设置 Page 对象的初始化状态。如果该请求不具有 mySession cookie,则将给请求者发放一个新的 mySession cookie。否则,将利用一个自定义的数据访问对象(SessionPersistence)从 SQL Server 中检索会话数据。dsn 和 SessionExpiration 值是从 web.config 中检索的。

          override protected void OnInit(EventArgs e) 
          { 
             InitializeComponent(); 
             base.OnInit(e); 
          } 
          private void InitializeComponent() 
          {     
             cookie = this.Request.Cookies[sessionPersistence.SessionID]; 
             if (cookie == null) 
             { 
                Session = new mySession(); 
                CreateNewSessionCookie(); 
                IsNewSession = true; 
             } 
             else 
                Session = sessionPersistence.LoadSession( 
    Server.UrlDecode(cookie.Value).ToLower().Trim(),  
    dsn,  
    SessionExpiration 
    ); 
             this.Unload += new EventHandler(this.PersistSession); 
          } 
          private void CreateNewSessionCookie() 
          { 
             cookie = new HttpCookie(sessionPersistence.SessionID,  
                sessionPersistence.GenerateKey()); 
             this.Response.Cookies.Add(cookie); 
          } 
    

    为了获得最佳性能,SessionPersistence 类利用 Microsoft .NET 框架的 BinaryFormatter,以二进制格式对会话状态进行序列化和反序列化。随后,可以将所得到的二进制会话状态数据以 art 字段类型存储在 SQL Server 中。

          public  mySession LoadSession(string key, string dsn,  
                                        int SessionExpiration) 
          { 
             SqlConnection conn = new SqlConnection(dsn); 
             SqlCommand LoadCmd = new SqlCommand(); 
             LoadCmd.CommandText = command; 
             LoadCmd.Connection = conn; 
             SqlDataReader reader = null; 
             mySession Session = null; 
             try 
             { 
                LoadCmd.Parameters.Add("@ID", new Guid(key)); 
                conn.Open(); 
                reader = LoadCmd.ExecuteReader(); 
                if (reader.Read()) 
                { 
                   DateTime LastAccessed = 
     reader.GetDateTime(1).AddMinutes(SessionExpiration); 
                   if (LastAccessed >= DateTime.Now) 
                      Session = Deserialize((Byte[])reader["Data"]); 
                } 
             } 
             finally 
             { 
                if (reader != null) 
                   reader.Close(); 
                if (conn != null) 
                   conn.Close(); 
             } 
             return Session; 
          } 
    private mySession Deserialize(Byte[] state) 
          { 
             if (state == null) return null; 
             mySession Session = null; 
             Stream stream = null; 
             try 
             { 
                stream = new MemoryStream(); 
                stream.Write(state, 0, state.Length); 
                stream.Position = 0; 
                IFormatter formatter = new BinaryFormatter(); 
                Session = (mySession)formatter.Deserialize(stream); 
             } 
             finally 
             { 
                if (stream != null) 
                   stream.Close(); 
             } 
             return Session; 
          } 
    

    当该请求结束时,将激发 Page 类的 Unload 事件,注册用于 Unload 事件的事件处理程序将会话数据序列化成二进制格式,并将所得的二进制数据保存到 SQL Server 中。

          private void PersistSession(Object obj, System.EventArgs arg) 
          {      sessionPersistence.SaveSession( 
                   Server.UrlDecode(cookie.Value).ToLower().Trim(),  
                   dsn, Session, IsNewSession); 
          } 
          public void SaveSession(string key, string dsn,  
    mySession Session, bool IsNewSession) 
          { 
             SqlConnection conn = new SqlConnection(dsn); 
             SqlCommand SaveCmd = new SqlCommand();          
             SaveCmd.Connection = conn; 
             try 
             { 
                if (IsNewSession) 
                   SaveCmd.CommandText = InsertStatement; 
                else 
                   SaveCmd.CommandText = UpdateStatement; 
                SaveCmd.Parameters.Add("@ID", new Guid(key)); 
                SaveCmd.Parameters.Add("@Data", Serialize(Session)); 
                SaveCmd.Parameters.Add("@LastAccessed", DateTime.Now.ToString()); 
                conn.Open(); 
                SaveCmd.ExecuteNonQuery(); 
             } 
             finally 
             { 
                if (conn != null) 
                   conn.Close(); 
             } 
          } 
    private Byte[] Serialize(mySession Session) 
          { 
             if (Session == null) return null; 
             Stream stream = null; 
             Byte[] state = null; 
             try 
             { 
                IFormatter formatter = new BinaryFormatter(); 
                stream = new MemoryStream(); 
                formatter.Serialize(stream, Session); 
                state = new Byte[stream.Length]; 
                stream.Position = 0; 
                stream.Read(state, 0, (int)stream.Length); 
                stream.Close(); 
             } 
             finally 
             { 
                if (stream != null) 
                   stream.Close(); 
             } 
             return state; 
          } 
    

    SessionPage 类及其相关类都封装在 SessionUtility 程序集中。在新的 ASP.NET 项目中,将建立一个对该 SessionUtility 程序集的引用,并且为了与传统 ASP 代码共享会话,将从 SessionPage 而不是 Page 类派生出每个页面。一旦完成迁移过程,通过注释掉 SessionPage 类中的 Session 变量声明即可解除基类 HttpSession 的隐藏,从而新的应用程序可切换回使用本机的 HttpSession 对象。

    ASP 实现

    本机的 ASP 会话只能将会话数据存储在内存中。为了将会话数据存储到 SQL Server 中,我们编写了一个自定义的 Microsoft Visual Basic6.0 COM 对象以管理会话状态,而不使用本机的会话对象进行管理。这个 COM 对象将在每个 Web 请求开始时得以实例化,并从 SQL Server 处重新加载会话数据。当 ASP 脚本完成时,此对象将终止,并且会话状态将被保存回 SQL Server 中。

    Visual Basic 6 COM Session 对象的主要目的就是提供对 Microsoft Internet Information Server 内部对象的访问。Visual Basic 6.0 COM Session 对象使用 SessionUtility 程序集的 mySession 类来保留会话状态,并使用 SessionUtility 的 SessionPersistence 类从 SQL Server 中加载会话数据或将会话数据保存回 SQL Server。利用 regasm.exe 实用工具,mySessionSessionPersistence 类可被公开为 COM 对象。regasm.exe 实用工具能够注册并创建一个类库,以便 COM 客户端使用各个框架类。

    在该对象的构造过程中,会话状态信息得以重新加载。构造函数 (class_initialize) 将首先从 Application 对象中检索会话 cookie、会话超时 (SessionTimeOut) 和数据库连接字符串 (SessionDSN),并创建 mySession 类的一个实例以持有这些会话数据。然后,构造函数将尝试利用给定的 cookie 从 SQL Server 中重新加载会话数据。如果 SQL Server 不包含相应的会话信息,或者该会话已经过期,则将发放一个新的 cookie。如果 SQL Sever 确实返回会话状态数据,则这些会话状态将被存储在 mySession 对象中。

    Private Sub Class_Initialize() 
    On Error GoTo ErrHandler: 
        Const METHOD_NAME As String = "Class_Initialize" 
        Set mySessionPersistence = New SessionPersistence 
        Set myObjectContext = GetObjectContext() 
        mySessionID = ReadSessionID() 
        myDSNString = GetConnectionDSN() 
        myTimeOut = GetSessionTimeOut() 
        myIsNewSession = False 
        Call InitContents 
        Exit Sub 
    ErrHandler: 
        Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description 
    End Sub 
    Private Sub InitContents() 
    On Error GoTo ErrHandler: 
        Const METHOD_NAME As String = "InitContents"     
        If mySessionID = "" Then 
            Set myContentsEntity = New mySession 
            mySessionID = mySessionPersistence.GenerateKey 
            myIsNewSession = True 
        Else 
            Set myContentsEntity =  
            mySessionPersistence.LoadSession(mySessionID, myDSNString, myTimeOut) 
        End If 
        Exit Sub 
    ErrHandler: 
        Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description 
    End Sub 
    

    当该对象实例超出脚本的作用范围时,析构函数 (class_terminate) 将执行。析构函数将利用 SessionPersistence.SaveSession() 方法保持会话数据。如果这是新会话,析构函数还会向浏览器回送一个新 cookie。

    Private Sub Class_Terminate() 
    On Error GoTo ErrHandler: 
        Const METHOD_NAME As String = "Class_Terminate" 
        Call SetDataForSessionID 
        Exit Sub  
    ErrHandler: 
     Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description>  
    End Sub 
    Private Sub SetDataForSessionID() 
    On Error GoTo ErrHandler: 
        Const METHOD_NAME As String = "SetDataForSessionID" 
        Call mySessionPersistence.SaveSession(mySessionID,  
    myDSNString, myContentsEntity, myIsNewSession) 
        If myIsNewSession Then Call WriteSessionID(mySessionID) 
        Set myContentsEntity = Nothing 
        Set myObjectContext = Nothing 
        Set mySessionPersistence = Nothing 
        Exit Sub 
    ErrHandler: 
        Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description 
    End Sub
    

    单击本文顶部的链接,您可以下载 ASP.NET SessionUtility 项目的源代码 — COM 会话管理器和演示代码。

    演示程序

    本演示程序的设计目的为递增并显示一个数字。不管加载哪个页面,该数字将总是递增,因为其数值存储在 SQL Server 中且在传统 ASP 和 ASP.NET 之间共享。

    演示程序的设置步骤

    创建一个名为 SessionDemoDb 的新数据库。

    创建 SessState 表 (osql.exe –E –d SessionDemoDb –i Session.sql)。

    创建名为 Demo 的新虚拟目录。

    关闭 ASP 配置选项卡中的 ASP Session。

    将 web.config、testPage.aspx、Global.asa、testPage.asp 和 GlobalInclude.asp 复制到虚拟目录中。

    更新 Global.asa 和 web.config 中的 DSN 字符串设置。会话超时设置是可选的。默认值为 20 分钟。聽

    将 SessionUtility.dll 安装到 Global Assembly Cache (gacutil /i SessionUtility.dll)。

    利用 regasm.exe 将 SessionUtility.dll 公开为 COM 对象 (regasm.exe SessionUtility.dll /tlb:SessionUtility.tlb)。

    将 SessionManager.dll 复制到一个本地目录中,并利用 regsvr32.exe 注册该文件 (regsvr32 SessionManager.dll)。

    为 IUSR_<machine_name> 帐号赋予对 SessionMgr.dll 的读和执行权限。

    演示程序的运行步骤

    启动 Microsoft Internet Explorer。

    加载传统 ASP 的 testPage.asp。Web 页面中应该显示数字 "1"。

    单击 Internet Explorer 上的刷新按钮,重新加载该页面。该数字应该递增。

    将 URL 改为 ASP.NET 版的 testPage.aspx。该数字应该继续递增。

    如果首先启动 testPage.aspx 页面,也可重复同样的过程。

    在现有的 ASP 应用程序中嵌入 COM 对象

    在开发 ASP 应用程序时,惯例是在每个脚本的开始处包含一个文件以便共享公共代码和常量。要加入自定义的会话对象,最佳的方法就是在公共的包含文件中添加相应的实例化代码。最后一个步骤就是将对该会话对象的全部引用替换为自定义的会话变量名。

    局限性/改进

    如果现有的 ASP 应用程序将一个 COM 对象存储在 Session 对象中,则此解决方案并不支持这种情况。在这种情况下,需要一个自定义的封送拆收器来序列化/反序列化各种状态,以便使用自定义的会话对象。此外,此解决方案不支持存储字符串类型数组。但只需稍加努力,我们就可利用 Microsoft Visual Basic6.0 Join 函数将所有的数组元素组合成单个字符串,然后再将其存入会话对象中,从而实现这种功能。利用 Visual Basic 6.0 Split 函数将该字符串分解成单独的数组元素即可完成反向操作。在 .NET 框架方面,JoinSplit 方法都是 String 类的成员。

    小结

    ASP.NET 代表了一种全新的编程典范和结构,并且比传统的 ASP 具有更多优势。虽然从 ASP 迁移到 ASP.NET 并不是一个简单的过程,但 ASP.NET 更好的编程模型和更高的性能使得这种转换过程物有所值。除了将 COM 对象存储在 Session 对象中的情况外,本文所述的方法提供了一种解决方案,使得这种迁移过程更加简单。

    关于作者

    Billy Yuen 就职于北加州的 Microsoft 硅谷技术中心。此中心致力于开发 Microsoft .NET 框架解决方案。如果希望与他联系,可发送电子邮件至billyy@microsoft.com


    JavaScript事件综合查询

    click() 对象.click() 使对象被点击。
    closed 对象.closed 对象窗口是否已关闭true/false
    clearTimeout(对象) 清除已设置的setTimeout对象
    clearInterval(对象) 清除已设置的setInterval对象
    confirm("提示信息") 弹出确认框,确定返回true取消返回false
    cursor:样式 更改鼠标样式 hand crosshair text wait help default auto e/s/w/n-resize

    event.clientX 返回最后一次点击鼠标X坐标值;
    event.clientY 返回最后一次点击鼠标Y坐标值;
    event.offsetX 返回当前鼠标悬停X坐标值
    event.offsetY 返回当前鼠标悬停Y坐标值

    document.write(document.lastModified) 网页最后一次更新时间
    document.ondblclick=x 当双击鼠标产生事件
    document.onmousedown=x 单击鼠标键产生事件

    document.body.scrollTop; 返回和设置当前竖向滚动条的坐标值,须与函数配合,
    document.body.scrollLeft; 返回和设置当前横向滚动务的坐标值,须与函数配合,
    document.title document.title="message"; 当前窗口的标题栏文字
    document.bgcolor document.bgcolor="颜色值"; 改变窗口背景颜色
    document.Fgcolor document.Fgcolor="颜色值"; 改变正文颜色
    document.linkcolor document.linkcolor="颜色值"; 改变超联接颜色
    document.alinkcolor document.alinkcolor="颜色值"; 改变正点击联接的颜色
    document.VlinkColor document.VlinkColor="颜色值"; 改变已访问联接的颜色
    document.forms.length 返回当前页form表单数
    document.anchors.length 返回当前页锚的数量
    document.links.length 返回当前页联接的数量
    document.onmousedown=x 单击鼠标触发事件
    document.ondblclick=x 双击鼠标触发事件
    defaultStatus window.status=defaultStatus; 将状态栏设置默认显示

    function function xx(){...} 定义函数
    isNumeric 判断是否是数字
    innerHTML xx=对象.innerHTML 输入某对象标签中的html源代码
    innerText divid.innerText=xx 将以div定位以id命名的对象值设为XX

    location.reload(); 使本页刷新,target可等于一个刷新的网页

    Math.random() 随机涵数,只能是0到1之间的数,如果要得到其它数,可以为*10,再取整
    Math.floor(number) 将对象number转为整数,舍取所有小数
    Math.min(1,2) 返回1,2哪个小
    Math.max(1,2) 返回1,2哪个大

    navigator.appName 返回当前浏览器名称
    navigator.appVersion 返回当前浏览器版本号
    navigator.appCodeName 返回当前浏览器代码名字
    navigator.userAgent 返回当前浏览器用户代标志

    onsubmit onsubmit="return(xx())" 使用函数返回值
    opener opener.document.对象 控制原打开窗体对象

    prompt xx=window.prompt("提示信息","预定值"); 输入语句
    parent parent.框架名.对象 控制框架页面

    return return false 返回值
    random 随机参数(0至1之间)
    reset() form.reset(); 使form表单内的数据重置

    split("") string.split("") 将string对象字符以逗号隔开
    submit() form对象.submit() 使form对象提交数据

    String对象的 charAt(x)对象 反回指定对象的第多少位的字母
    lastIndexOf("string") 从右到左询找指定字符,没有返回-1
    indexOf("string") 从左到右询找指定字符,没有返回-1
    LowerCase() 将对象全部转为小写
    UpperCase() 将对象全部转为大写
    substring(0,5) string.substring(x,x) 返回对象中从0到5的字符
    setTimeout("function",time) 设置一个超时对象
    setInterval("function",time) 设置一个超时对象

    toLocaleString() x.toLocaleString() 从x时间对象中获取时间,以字符串型式存在
    typeof(变量名) 检查变量的类型,值有:String,Boolean,Object,Function,Underfined

    window.event.button==1/2/3 鼠标键左键等于1右键等于2两个键一起按为3
    window.screen.availWidth 返回当前屏幕宽度(空白空间)
    window.screen.availHeight 返回当前屏幕高度(空白空间)
    window.screen.width 返回当前屏幕宽度(分辨率值)
    window.screen.height 返回当前屏幕高度(分辨率值)
    window.document.body.offsetHeight; 返回当前网页高度
    window.document.body.offsetWidth; 返回当前网页宽度
    window.resizeTo(0,0) 将窗口设置宽高
    window.moveTo(0,0) 将窗口移到某位置
    window.focus() 使当前窗口获得焦点
    window.scroll(x,y) 窗口滚动条坐标,y控制上下移动,须与函数配合
    window.open() window.open("地址","名称","属性")
    属性:toolbar(工具栏),location(地址栏),directions,status(状态栏),
    menubar(菜单栏),scrollbar(滚动条),resizable(改变大小), width(宽),height(高),fullscreen(全 屏),scrollbars(全屏时无滚动条无参 数,channelmode(宽屏),left(打开窗口x坐标),top(打开窗口y坐标)
    window.location = 'view-source:' + window.location.href 应用事件查看网页源代码;


    a=new Date(); //创建a为一个新的时期对象
    y=a.getYear(); //y的值为从对象a中获取年份值 两位数年份
    y1=a.getFullYear(); //获取全年份数 四位数年份
    m=a.getMonth(); //获取月份值
    d=a.getDate(); //获取日期值
    d1=a.getDay(); //获取当前星期值
    h=a.getHours(); //获取当前小时数
    m1=a.getMinutes(); //获取当前分钟数
    s=a.getSeconds(); //获取当前秒钟数


    对象.style.fontSize="文字大小";
    单位:mm/cm/in英寸/pc帕/pt点/px象素/em文字高
    1in=1.25cm
    1pc=12pt
    1pt=1.2px(800*600分辩率下)

    文本字体属性:
    fontSize大小
    family字体
    color颜色
    fontStyle风格,取值为normal一般,italic斜体,oblique斜体且加粗
    fontWeight加粗,取值为100到900不等,900最粗,light,normal,bold
    letterSpacing间距,更改文字间距离,取值为,1pt,10px,1cm
    textDecoration:文字修饰;取值,none不修饰,underline下划线,overline上划线
    background:文字背景颜色,
    backgroundImage:背景图片,取值为图片的插入路径


    点击网页正文函数调用触发器:

    1.onClick 当对象被点击
    2.onLoad 当网页打开,只能书写在body中
    3.onUnload 当网页关闭或离开时,只能书写在body中
    4.onmouseover 当鼠标悬于其上时
    5.onmouseout 当鼠标离开对象时
    6.onmouseup 当鼠标松开
    7.onmousedown 当鼠标按下键
    8.onFocus 当对象获取焦点时
    9.onSelect 当对象的文本被选中时
    10.onChange 当对象的内容被改变
    11.onBlur 当对象失去焦点
    onsubmit=return(ss())表单调用时返回的值

    直线 border-bottom:1x solid black
    虚线 border-bottom:1x dotted black
    点划线 border-bottom:2x dashed black
    双线 border-bottom:5x double black
    槽状 border-bottom:1x groove black
    脊状 border-bottom:1x ridge black


    1.边缘高光glow(color=颜色,strength=亮光大小)<br>
    2.水平翻转fliph() 使对象水平翻转180度<br>
    3.垂直翻转flipv() 使对象垂直翻转180度<br>
    4.对象模糊blur(add=true/false direction=方向 strength=强度)
    add指定是否按印象画派进行模糊direction模糊方向strength模糊强度
    5.对象透明alpha(opaction=0-100,finishopacity=0-100,style=0/1/2/3)
    opaction对象整体不透明值finishopacity当对象利用了渐透明时该项指定结束透明位置的不透明值style指定透明方式0为整体透明,1为线型透明,2为圆型透明,3为矩形透明
    6.去除颜色chroma(color=颜色值)使对象中颜色与指定颜色相同区域透明
    7.建立阴影dropshadow(color=阴影颜色,offx=水平向左偏离像素,offy=水平向下偏离像素)
    8.去色gray()使对象呈灰度显示
    9.负片效果invert()使对象呈底片效果
    10.高光light()使对象呈黑色显示
    11.遮盖mask(color=颜色)使整个对象以指定颜色进行蒙板一次

    opacity 表透明度水平.0~100,0表全透明,100表完全不透明
    finishopacity表想要设置的渐变透明效果.0~100.
    style 表透明区的形状.0表统一形状.1表线形.2表放射形.3表长方形.
    startx.starty表渐变透明效果的开始时X和Y坐标.
    finishx,finishy渐变透明效果结束时x,y 的坐标.
    add有来确定是否在模糊效果中使有原有目标.值为0,1.0表"否",1表"是".
    direction设置模糊的方向.0度表垂直向上,45度为一个单位.默认值是向左270度.left,right,down,up.
    strength 只能用整数来确定.代表有多少个像素的宽度将受到模糊影响.默认是5个.
    color要透明的颜色.
    offx,offy分别是x,y 方向阴影的偏移量.
    positive指投影方式.0表透明像素生成阴影.1表只给出不透明像素生成阴影..

    AddAmbient:加入包围的光源.
    AddCone:加入锥形光源.
    AddPoint加入点光源
    Changcolor:改变光的颜色.
    Changstrength:改变光源的强度.
    Clear:清除所有的光源.
    MoveLight:移动光源.

    freq是波纹的频率,在指定在对象上一区需要产生多少个完事的波纹.
    lightstrength可对于波纹增强光影的效果.显著0~100正整数,正弦波开始位置是0~360度.0表从0度开始,25表从90度开始.
    strength表振幅大小.


    hand style="cursor:hand"
    crosshair style="cursor:crosshair"
    text style="cursor:text"
    wait style="cursor:wait"
    default style="cursor:default"
    help style="cursor:help"
    e-resize style="cursor:e-resize"
    ne-resize style="cursor:ne-resize"
    n-resize style="cursor:n-resize"
    nw-resize style="cursor:nw-resize"
    w-resize style="cursor:w-resize"
    s-resize style="cursor:s-resize"
    sw-resize style="cursor:sw-resize "
    se-resize style="cursor:se-resize"
    auto style="cursor:auto"
    November 30

    ASP.Net配置文件

    一、认识Web.config文件

      Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过VB.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的
    Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置。如果你想修改子目录的配置设置,你可以在该子目录下新建一个Web.config文件。它可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置。

      在运行时对Web.config文件的修改不需要重启服务就可以生效(注:<processModel> 节例外)。当然Web.config文件是可以扩展的。你可以自定义新配置参数并编写配置节处理程序以对它们进行处理。

      二、web.config配置文件(默认的配置设置)以下所有的代码都应该位于

    <configuration>
    <system.web>

      和

    </system.web>
    </configuration>

      之间,出于学习的目的下面的示例都省略了这段XML标记

      1、<authentication> 节

      作用:配置 ASP.NET 身份验证支持(为Windows、Forms、PassPort、None四种)。该元素只能在计算机、站点或应用程序级别声明。<authentication> 元素必需与<authorization> 节配合使用。

      示例:

      以下示例为基于窗体(Forms)的身份验证配置站点,当没有登陆的用户访问需要身份验证的网页,网页自动跳转到登陆网页。

    <authentication mode="Forms" >
    <forms loginUrl="logon.aspx" name=".FormsAuthCookie"/>

    </authentication>

      其中元素loginUrl表示登陆网页的名称,name表示Cookie名称

      2、<authorization> 节

      作用:控制对 URL 资源的客户端访问(如允许匿名用户访问)。此元素可以在任何级别(计算机、站点、应用程序、子目录或页)上声明。必需与<authentication> 节配合使用。

      示例:以下示例禁止匿名用户的访问

    <authorization>
     <deny users="?"/>
    </authorization>

      注:你可以使用user.identity.name来获取已经过验证的当前的用户名;可以使用
    web.Security.FormsAuthentication.RedirectFromLoginPage方法将已验证的用户重定向到用户刚才请求的页面.具体的实例请参考:

      Forms验证 http://www.fanvb.net/websample/dataauth.aspx

      3、<compilation>节

      作用:配置 ASP.NET 使用的所有编译设置。默认的debug属性为“True”.在程序编译完成交付使用之后应将其设为True(Web.config文件中有详细说明,此处省略示例)

      4、<customErrors>

      作用:为 ASP.NET 应用程序提供有关自定义错误信息的信息。它不适用于 XML Web services 中发生的错误。

      示例:当发生错误时,将网页跳转到自定义的错误页面。

    <customErrors defaultRedirect="ErrorPage.aspx" mode="RemoteOnly">
    </customErrors>

      其中元素defaultRedirect表示自定义的错误网页的名称。mode元素表示:对不在本地 Web 服务器上运行的用户显示自定义(友好的)信息。

      5、<httpRuntime>节

      作用:配置 ASP.NET HTTP 运行库设置。该节可以在计算机、站点、应用程序和子目录级别声明。

      示例:控制用户上传文件最大为4M,最长时间为60秒,最多请求数为100

    <httpRuntime maxRequestLength="4096" executionTimeout="60" appRequestQueueLimit="100"/>

      6、 <pages>

      作用:标识特定于页的配置设置(如是否启用会话状态、视图状态,是否检测用户的输入等)。<pages>可以在计算机、站点、应用程序和子目录级别声明。

      示例:不检测用户在浏览器输入的内容中是否存在潜在的危险数据(注:该项默认是检测,如果你使用了不检测,一要对用户的输入进行编码或验证),在从客户端回发页时将检查加密的视图状态,以验证视图状态是否已在客户端被篡改。(注:该项默认是不验证)

    <pages buffer="true" enableViewStateMac="true" validateRequest="false"/>

      7、<sessionState>

      作用:为当前应用程序配置会话状态设置(如设置是否启用会话状态,会话状态保存位置)。

      示例:

    <sessionState mode="InProc" cookieless="true" timeout="20"/>
    </sessionState>

      注:

      mode="InProc"表示:在本地储存会话状态(你也可以选择储存在远程服务器或SAL服务器中或不启用会话状态)

      cookieless="true"表示:如果用户浏览器不支持Cookie时启用会话状态(默认为False)

      timeout="20"表示:会话可以处于空闲状态的分钟数

      8、<trace>

      作用:配置 ASP.NET 跟踪服务,主要用来程序测试判断哪里出错。

      示例:以下为Web.config中的默认配置:

    <trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />

      注:

      enabled="false"表示不启用跟踪;requestLimit="10"表示指定在服务器上存储的跟踪请求的数目

      pageOutput="false"表示只能通过跟踪实用工具访问跟踪输出;

      traceMode="SortByTime"表示以处理跟踪的顺序来显示跟踪信息

      localOnly="true" 表示跟踪查看器 (trace.axd) 只用于宿主 Web 服务器

      三、自定义Web.config文件配置节

      自定义Web.config文件配置节过程分为两步。

      一是在在配置文件顶部 <configSections> 和 </configSections>标记之间声明配置节的名称和处理该节中配置数据的 .NET Framework 类的名称。

      二是在 <configSections> 区域之后为声明的节做实际的配置设置。

      示例:创建一个节存储数据库连接字符串

    <configuration>
     <configSections>
     <section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </configSections>

     <appSettings>
      <add key="scon" value="server=a;database=northwind;uid=sa;pwd=123"/>
     </appSettings>

     <system.web>
      ......
     </system.web>
    </configuration>  

      四、访问Web.config文件

      你可以通过使用ConfigurationSettings.AppSettings 静态字符串集合来访问 Web.config 文件示例:获取上面例子中建立的连接字符串。

    Dim sconstr As String = ConfigurationSettings.AppSettings("SconStr")
    Dim scon = New SqlConnection(sconstr)

    转自: http://goaler.xicp.net/ShowLog.asp?ID=505