Web.Config详解

( ). 选择会话状态存储方式
     Webconfig 文件配置 :
     <sessionState mode="???" stateConnectionString="tcpip=127.0.0.1:42424"
          sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
       cookieless="false" timeout="20"/>
      
     Asp.net 有三种方式存储会话状态信息 :
     1. 存储在进程中 : 属性 mode = InProc
        特点: 具有最佳的性能,速度最快 , 但不能跨多台服务器存储共享 .
     2. 存储在状态服务器中 : 属性 mode = "StateServer"
        特点 :    当需要跨服务器维护用户会话信息时,使用此方法。
                但是信息存储在状态服务器上,一旦状态服务器出现故障,信息将丢失
    
     3. 存储在 Sql Server : 属性 mode="SqlServer"
        特点 :    工作负载会变大,但信息不会丢失 .
     补充一点:
        I. 由于某些页面不需要会话状态,则可以将会话状态禁用 :
              代码如下: <%@ Page EnableSessionState="false" %>
        II. 如果页面需要访问会话变量但不允许修改它们,可以设置页面会话状态为只读 :
              代码如下: <%@ Page EnableSessionState="false" %>
     使用时可以根据具体情况选择某种方式
( ). 使用 Page.IsPostBack
     Page.IsPostBack 表示是否是从客户端返回的 . 初次运行时,不是从客户端返回,它的值
     false, 当触发页面上的事件或刷新页面时, Page.IsPostBack 由于是回发的,值变为 true;
     一般在 : Page_Load 方法中用 :
     private void Page_Load(Object sender,EventArgs e)
     {
         if(!Page.IsPostBack)
         {
              ....; // 初始化页面的代码。这些代码第一次页面初始化时执行,当第二次回发时,
                     // 不会再执行。提高效率。
         }
     }
     往往很多时候不得不用 IsPostBack, 因为有些控件初始化后,要保持它的状态 .
     例如 : DropDownList, 如果每次都初始化,则用户无论选择其选项,都会被初始化为默认值 .
( ). 避免使用服务器控件
     1. 一般的静态显示信息,尽量不要用服务端控件显示 . 因为服务端控件需要回发服务端执行 ,
       会降低程序执行效率 , 一般用 <DIV> 显示即可 .
       如果用了服务端控件,将 : runat="server" 去掉 , 也会提高效率 .
     2. 禁用服务端控件的状态视图,有些控件不需要维护其状态,可以设置其属性 : EnableViewState=false;
       如果整个页面控件都不需要维持状态视图,则可以设置整个页面的状态视力为 false:
          代码如下 : <%@ Page EnableViewState="false"%>
     3. Web.Config 文件中配置 :
           ASP.NET Sessionss 可以在 Web.config Machine.config 中的 Sessionsstate 元素中配置。
           下面是在 Web.config 中的设置的例子:
             <Sessionsstate timeout="10" cookieless="false" mode="Inproc" />
( ). 避免使用 DataGrid
     大家都知道 DataGrid 功能强大。 但是功能强大的同时,增加了性能上的开销。 一般用其它控件 : DataList
     Repeater 控件能实现的,尽量不用 DataGrid.
( ). 字符串操作
     1. 避免装箱操作 . 装箱操作运行效率比较低 .
       例如运行两个代码段 :   
         string test="";
          for(for int i=0;i<10000;i++)
          {
              test = test + i;             
          }
         
                   string test="";
          for(for int i=0;i<10000;i++)
          {
              test = test + i.ToString();             
          }
        下面的代码段显然效率要高 . 因为 i 是整型的,系统要先把 i 进行装箱转换为 string 型的,再进行连接 . 需要时间
        读者可以 Copy 到自己机器上测试一下 .
      2. 使用 StringBulider
        在进行字符串连接时 : string str = str1 + str2 + ....;
        一般超过三项连接,最好用 StringBuilder 来代替 String . StringBuilder 可以避免重新创建 String 对象造成
        的性能损失 .
        一般用于组装 Sql 语句时用到 : StringBulider.
        读者可以到自己机器上测试一下 .
3. 尽量少用 :
         try
         {}
         catch
         {}
         finally
         {}
         语句 . 此语句执行效率比较低 .
(六).ADO.Net使用方面优化
      1. 数据库连接打开和关闭。 在需要连接时打开,当访问完数据库要立刻关闭连接 .
        举例说明 , 还是看两个代码段 :
       I.
            DataSet ds = new DataSet();
            SqlConnection MyConnection = new SqlConnection("server=localhost; uid=sa; pwd=; database=NorthWind");
            SqlCommand myCommand = new SqlCommand(strSql,MyConnection);   
            SqlDataAdapter myAdapter=new SqlDataAdapter(queryStr,connectionStr);
         MyConnection.Open();       // 打开连接
         for(int i=0;i<1000;i++)    //for 循环模拟取得数据前的商业逻辑操作
          {
             Thread.Sleep(1000);
        }
        myAdapter.Fill(ds);
         for(int i=0;i<1000;i++)    //for 循环模拟取得数据后的商业逻辑操作
         {
            Thread.Sleep(1000);
         }
         MyConnection.Close();      // 关闭连接
         II.
            DataSet ds = new DataSet();
            SqlConnection MyConnection = new SqlConnection("server=localhost; uid=sa; pwd=; database=NorthWind");
            SqlCommand myCommand = new SqlCommand(strSql,MyConnection);   
            SqlDataAdapter myAdapter=new SqlDataAdapter(queryStr,connectionStr);        
          for(int i=0;i<1000;i++)    //for 循环模拟取得数据前的商业逻辑操作
          {
             Thread.Sleep(1000);
        }
        MyConnection.Open();       // 打开连接
            myAdapter.Fill(ds);
           MyConnection.Close();      // 关闭连接
         for(int i=0;i<1000;i++)    ////for 循环模拟取得数据后的商业逻辑操作
         {
            Thread.Sleep(1000);
         }
          显示 II 代码比 I 代码好的多, I 中早早占着连接不放,如果用户很多的话,容易出现连接池满情况。严重时出现死机现象 .
        2. 数据库查询
           I. 直接生成 SQL 语句。 Sql Server 每次都要对其进行编译,在性能方面不会有很大的提高。 另外也不够安全。容易被攻击 .
           II. 使用带参数的 SQL 命令。这种方式 Sql Server 只对其编译一次,对于不同的参数可以重复使用编译后的命令。提高了性能 .
           III. 使用 Sql Server 存储过程 . 编译一次 . 具有独立性,便于修改和维护 . 一次能完成用语句发送多次的功能 . 减少了网络的
               流量。 并不一定存储过程一定比语句效率要高,如果商业逻辑很复杂的话,有时候用语句比存储过程效率要高 .
( ). 缓存优化
      缓存分为两种: 页面缓存和 API 缓存 .
     1. 使用页面缓存和片段缓存
         <%@ OutputCache Duration="5" VaryByParam="None"%>
         <%@ OutputCache Duration=60 VaryByParam=”TextBox1,TextBox2” %>
       说明 : Duration 是设置 Cache 的过期时间 ;
           VarByParam 是设置是否根据参数而变化 ,None 时所有参数使用同一 Cache,
           设置 TextBox1 时则根据 TextBox1 的不同值分别缓存 ; 当有多个参数时则要组合缓存 ;
     2.API 缓存。用于在应用程序中使用
        I. 一个 Cache 使用的例子 :
            http://blog.csdn.net/chengking/archive/2005/10/03/494545.aspx
        II. 使用时注意 Page.Cache HttpContext.Current.Cache 区别 :
           它们指的同一个对象,在 Page 里,用 Page.Cache ,如果在 global.asax 或自己的类里用 :HttpContext.Current.Cache 在有些事件中,由于其没有 HttpContext ,就用 HttpRuntime.Cache.
 
二、 web.config 中的 session 配置详解
打开某个应用程序的配置文件 Web.config 后,我们会发现以下这段:
< sessionState
   mode="InProc"
   stateConnectionString="tcpip=127.0.0.1:42424"
   sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
   cookieless="false"
   timeout="20"
/>
  这一段就是配置应用程序是如何存储 Session 信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。 sessionState 节点的语法是这样的:
< sessionState mode="Off|InProc|StateServer|SQLServer"
               cookieless="true|false"
               timeout="number of minutes"
               stateConnectionString="tcpip=server:port"
               sqlConnectionString="sql connection string"
               stateNetworkTimeout="number of seconds"
/>
必须有的属性是: 属性 选项 描述
mode 设置将 Session 信息存储到哪里
Ø           Off 设置为不使用 Session 功能,
Ø           InProc 设置为将 Session 存储在进程内,就是 ASP 中的存储方式,这是默认值,
Ø           StateServer 设置为将 Session 存储在独立的状态服务中,
Ø           SQLServer 设置将 Session 存储在 SQL Server 中。
可选的属性是: 属性 选项 描述
Ø           cookieless 设置客户端的 Session 信息存储到哪里,
Ø           ture 使用 Cookieless 模式,
Ø           false 使用 Cookie 模式,这是默认值,
Ø           timeout 设置经过多少分钟后服务器自动放弃 Session 信息,默认为 20 分钟。
stateConnectionString 设置将 Session 信息存储在状态服务中时使用的服务器名称和端口号,例如: "tcpip=127.0.0.1:42424。当mode 的值是 StateServer 是,这个属性是必需的。
sqlConnectionString 设置与 SQL Server 连接时的连接字符串。例如 "data source= localhost;Integrated Security=SSPI;Initial Catalog=northwind" 。当 mode 的值是 SQLServer 时,这个属性是必需的。
stateNetworkTimeout 设置当使用 StateServer 模式存储 Session 状态时,经过多少秒空闲后,断开 Web 服务器与存储状态信息的服务器的 TCP/IP 连接的。默认值是 10 秒钟。
ASP.NET 中客户端 Session 状态的存储
  在我们上面的 Session 模型简介中,大家可以发现 Session 状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的 SessionID ,而其他的 Session 信息则保存在服务器端。在 ASP 中,客户端的 SessionID 实际是以 Cookie 的形式存储的。如果用户在浏览器的设置中选择了禁用 Cookie ,那末他也就无法享受 Session 的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在 ASP.NET 中客户端的 Session 信息存储方式分为: Cookie Cookieless 两种。
   ASP.NET 中,默认状态下,在客户端还是使用 Cookie 存储 Session 信息的。如果我们想在客户端使用 Cookieless 的方式存储 Session 信息的方法如下:
  找到当前 Web 应用程序的根目录,打开 Web.Config 文件,找到如下段落:
< sessionState
   mode="InProc"
   stateConnectionString="tcpip=127.0.0.1:42424"
   sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
   cookieless="false"
   timeout="20"
/>
  这段话中的 cookieless="false" 改为: cookieless="true" ,这样,客户端的 Session 信息就不再使用 Cookie 存储了,而是将其通过 URL 存储。关闭当前的 IE ,打开一个新 IE ,重新访问刚才的 Web 应用程序,就会看到类似下面的样子:
其中, http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245) /default.aspx 中黑体标出的就是客户端的 Session ID 。注意,这段信息是由 IIS 自动加上的,不会影响以前正常的连接。
ASP.NET 中服务器端 Session 状态的存储 准备工作:
  为了您能更好的体验到实验现象,您可以建立一个叫做 SessionState.aspx 的页面,然后把以下这些代码添加到 < body>< /body> 中。
< scriptrunat="server">
Sub Session_Add(sender As Object, e As EventArgs)
  Session("MySession") = text1.Value
  span1.InnerHtml = "Session data updated! < P>Your session contains: < font color=red>" & Session("MySession"). ToString() & "< /font>"
End Sub
Sub CheckSession(sender As Object, eAs EventArgs)
  If (Session("MySession")Is Nothing) Then
    span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
  Else
    span1.InnerHtml = "Your session contains: < font color= red>" & Session("MySession").ToString() & "<     /font>"
End If
End Sub
< /script>
< formrunat="server"id="Form2">
  < inputid="text1"type="text"runat="server"name="text1">
  < inputtype="submit"runat="server"OnServerClick="Session_Add"
      value="Add to Session State " id="Submit1"name="Submit1">
  < inputtype="submit"runat="server"OnServerClick="CheckSession"
      value=" View Session State " id="Submit2"name="Submit2">
< /form>
< hrsize="1">
< fontsize="6">< spanid="span1"runat="server" />< /font>
  这个 SessionState.aspx 的页面可以用来测试在当前的服务器上是否丢失了 Session 信息。
将服务器 Session 信息存储在进程中
  让我们来回到 Web.config 文件的刚才那段段落中:
< sessionState
   mode="InProc"
   stateConnectionString="tcpip=127.0.0.1:42424"
   sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
   cookieless="false"
   timeout="20"
/>
   mode 的值是 InProc 时, 说明服务器正在使用这种模式。
  这种方式和以前 ASP 中的模式一样,就是服务器将 Session 信息存储在 IIS 进程中。当 IIS 关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的 Session 信息都存储在了 IIS 的进程中,所以 IIS 能够很快的访问到这些信息,这种模式的性能比进程外存储 Session 信息或是在 SQL Server 中存储 Session 信息都要快上很多。这种模式也是 ASP.NET 的默认方式。
  好了,现在让我们做个试验。打开刚才的 SessionState.aspx 页面,随便输入一些字符,使其存储在 Session 中。然后,让我们让 IIS 重起。注意,并不是使当前的站点停止再开始,而是在 IIS 中本机的机器名的节点上点击鼠标右键,选择重新启动 IIS ( 想当初使用 NT4 时,重新启动 IIS 必须要重新启动计算机才行,微软真是 @#$%^&) 返回到 SessionState.aspx 页面中,检查刚才的 Session 信息,发现信息已经丢失了。
将服务器 Session 信息存储在进程外
  首先,让我们来打开管理工具 -> 服务,找到名为: ASP.NET State Service 的服务,启动它。实际上,这个服务就是启动一个要保存 Session 信息的进程。启动这个服务后,你可以从 Windows 任务管理器 -> 进程中看到一个名为 aspnet_state.exe 的进程,这个就是我们保存 Session 信息的进程。
  然后,回到 Web.config 文件中上述的段落中,将 mode 的值改为 StateServer 。保存文件后的重新打开一个 IE ,打开 SessionState.aspx 页面,保存一些信息到 Session 中。这时,让我们重起 IIS ,再回到 SessionState.aspx 页面中查看刚才的 Session 信息,发现没有丢失。
  实际上,这种将 Session 信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将 Session 信息存储在其他的服务器的进程中。这时,不光需要将 mode 的值改为 StateServer ,还需要在 stateConnectionString 中配置相应的参数。例如你的计算你是 192.168.0.1 ,你想把 Session 存储在 IP 192.168.0.2 的计算机的进程中,就需要设置成这样: stateConnectionString="tcpip=192.168.0.2:42424" 。当然,不要忘记在 192.168.0.2 的计算机中装上 .NET Framework ,并且启动 ASP.NET State Services 服务。
将服务器 Session 信息存储在 SQL Server
  首先,还是让我们来做一些准备工作。启动 SQL Server SQL Server 代理服务。在 SQL Server 中执行一个叫做 InstallSqlState.sql 的脚本文件。这个脚本文件将在 SQL Server 中创建一个用来专门存储 Session 信息的数据库,及一个维护 Session 信息数据库的 SQL Server 代理作业。我们可以在以下路径中找到那个文件:
[system drive]/winnt/Microsoft.NET/Framework/[version]/
  然后打开查询分析器,连接到 SQL Server 服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫 ASPState 的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上 Session 信息是存储在了 tempdb 数据库的 ASPStateTempSessions 表中的,另外一个 ASPStateTempApplications 表存储了 ASP Application 对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理 ->SQL Server 代理 -> 作业,发现也多了一个叫做 ASPState_Job_DeleteExpiredSessions 的作业,这个作业实际上就是每分钟去 ASPStateTempSessions 表中删除过期的 Session 信息的。
  接着,我们返回到 Web.config 文件,修改 mode 的值改为 SQLServer 。注意,还要同时修改 sqlConnectionString 的值,格式为:
sqlConnectionString="data source=localhost; Integrated Security=SSPI;"
  其中 data source 是指 SQL Server 服务器的 IP 地址,如果 SQL Server IIS 是一台机子,写 127.0.0.1 就行了。 Integrated Security=SSPI 的意思是使用 Windows 集成身份验证,这样,访问数据库将以 ASP.NET 的身份进行,通过如此配置,能够获得比使用 userid=sa;password= 口令的 SQL Server 验证方式更好的安全性。当然,如果 SQL Server 运行于另一台计算机上,你可能会需要通过 Active Directory 域的方式来维护两边验证的一致性。
  同样,让我们做个试验。向 SessionState.aspx 中添加 Session 信息,这时发现 Session 信息已经存在 SQL Server 中了,即使你重起计算机,刚才的 Session 信息也不会丢失。现在,你已经完全看见了 Session 信息到底是什么样子的了,而且又是存储在 SQL Server 中的,能干什么就看你的发挥了。
总结
三、 Asp.net 关于 form 认证的一般设置
asp.net 关于 form 认证的一般设置:
1: web.config 中,加入 form 认证;
     <authentication mode="Forms">
              <forms name="auth" loginUrl="index.aspx" timeout="30"></forms>
</authentication>
<authorization>
          <deny users="?" />
</authorization>
2: 如果有注册页面时还应该允许匿名用户调用注册页面进行注册 ;
以下代码应该在 <configuration><system.web> 之间 , 而不应该包含到 <system.web>..</system.web> 之间 ;
---------------- 表示允许 匿名用户对 userReg.aspx 页面进行访问 .
<location path="userReg.aspx">
<system.web>
       <authorization>
           <allow users="?" />
       </authorization>
</system.web>
</location>
3 在登录成功后要创建身份验证票 , 表明已经通过认证的合法用户 ;
if( 登陆成功 )
System.Web.Security.FormsAuthentication.SetAuthCookie( 用户名称 , false);
  四、访问 Web.config 文件
  你可以通过使用 ConfigurationSettings.AppSettings 静态字符串集合来访问 Web.config 文件示例:获取上面例子中建立的连接字符串。例如:
protected static string Isdebug = ConfigurationSettings.AppSettings["scon"]

你可能感兴趣的:(sql,server,session,服务器,存储,asp.net,sqlserver)