<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT备忘录 - C#/Asp.net</title><link>http://www.dazix.cn/</link><description>沈阳网站制作|建设|策划|改版|SEO|优化|排名|推广|网络营销 - </description><generator>RainbowSoft Studio Z-Blog 1.8 Spirit Build 80722</generator><language>zh-CN</language><copyright>Copyright 2007-2010 www.dazix.cn All Rights Reserved. Powered By Z-Blog 专注于沈阳本地网站制作、建设、策划、改版、SEO、优化、排名、推广、网络营销、Archiver</copyright><pubDate>Sun, 05 Sep 2010 08:53:08 +0800</pubDate><item><title>&amp;quot;/&amp;quot;应用程序中的服务器错误 System.IO.DirectoryNotFoundException </title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/76.html</link><pubDate>Wed, 19 May 2010 14:51:56 +0800</pubDate><guid>http://www.dazix.cn/post/76.html</guid><description><![CDATA[<h2><i>未找到路径&ldquo;C:\&rdquo;的一部分。</i></h2><p><font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif "><b>说明: </b>执行当前 Web 请求期间，出现未处理的异常。请检查堆栈跟踪信息，以了解有关该错误以及代码中导致错误的出处的详细信息。 <br /><br /><b>异常详细信息: </b>System.IO.DirectoryNotFoundException: 未找到路径&ldquo;G:\&rdquo;的一部分。<br /><br /><b>源错误:</b><table width="100%" bgcolor="#ffffcc">    <tbody>        <tr>            <td><code>执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。</code></td>        </tr>    </tbody></table><br /><b><font face="Verdana">堆栈跟踪:</font></b> <br /><table width="100%" bgcolor="#ffffcc">    <tbody>        <tr>            <td><code>            <pre>[DirectoryNotFoundException: 未找到路径&ldquo;G:\&rdquo;的一部分。]<br />&nbsp;&nbsp; System.IO.__Error.WinIOError(Int32 errorCode, String str) +287<br />&nbsp;&nbsp; System.IO.Directory.InternalCreateDirectory(String fullPath, String path) +489<br />&nbsp;&nbsp; System.IO.Directory.CreateDirectory(String path) +195<br />&nbsp;&nbsp; DvNews.Admin.BasePage.x7a42976890112af7(String xcc73173c60d9e1a3) +1166<br />&nbsp;&nbsp; DvNews.Admin.MakeStatic.btSort_OnClick(Object xe0292b9ed559da7d, EventArgs x09164e3c6108269f) +318<br />&nbsp;&nbsp; System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108<br />&nbsp;&nbsp; System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57<br />&nbsp;&nbsp; System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18<br />&nbsp;&nbsp; System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33<br />&nbsp;&nbsp; System.Web.UI.Page.ProcessRequestMain() +1292<br /></pre>            </code></td>        </tr>    </tbody></table><br /></font><p>解决方法：<br />分析： 首先这是对该分区没有访问权限 需求给它分配权限<br />方法：&nbsp;1.&nbsp;&nbsp;&nbsp;找到IIS 选择网络服务&nbsp;&nbsp;<br /><img border="0" src="http://images.cnblogs.com/cnblogs_com/qiao198/IIS1.GIF" alt="" />&nbsp; <br />2. 找该分区 选中属性－－安全<br /><img border="0" src="http://images.cnblogs.com/cnblogs_com/qiao198/G1.GIF" alt="" /><br />3.找到添加按钮&nbsp;&nbsp; 选中SERVICE&nbsp; 并 确定<br /><img border="0" src="http://images.cnblogs.com/cnblogs_com/qiao198/G2.GIF" alt="" /><br />4.加SERVICE后， 点高级 弹出以下画面&nbsp; 然后对SERVICE 分配相就的权限 不要全选<br /><img border="0" src="http://images.cnblogs.com/cnblogs_com/qiao198/G3.GIF" alt="" /><br />最后按确定 就这样解决<br />&nbsp;</p></p><hr color="#c0c0c0" size="1" width="100%" />]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/76.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=76</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=76&amp;key=6df5d7f9</trackback:ping></item><item><title>IP访问处理,IP限制,获得IP地址并作出具体处理</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/53.html</link><pubDate>Tue, 23 Feb 2010 23:39:00 +0800</pubDate><guid>http://www.dazix.cn/post/53.html</guid><description><![CDATA[<p>非常常见的获取IP的应用</p><p>获得IP地址并对IP地址进行判断然后做出相应的处理</p><p>1、获得请求的IP地址<br />2、判断请求是否为当天请求<br />3、如果是检验访问次数是否超过3次 超过则禁止访问 未达到3次则记录访问次数<br />4、判断请求为第二天请求<br />5、记录前一天的总访问次数并且删除前一天的所有IP访问信息<br />6、如果是检验访问次数是否超过3次 超过则禁止访问 未达到3次则记录访问次数</p><p>private void ValidIPRequest()<br />{<br />&nbsp;string ip = &quot;&quot;;<br />&nbsp;string temptime = &quot;&quot;;<br />&nbsp;string time = &quot;&quot;;<br />&nbsp;<br />&nbsp;try<br />&nbsp;{<br />&nbsp;&nbsp;ip = Request.ServerVariables[&quot;HTTP_X_FORWARDED_FOR&quot;];//使用代理服务器时,透过代理获得客户机真实IP<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(ip == null)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;ip = Request.ServerVariables[&quot;REMOTE_ADDR&quot;];//当不采用代理时,直接获得客户机IP<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;time = DateTime.Now.ToString(&quot;yyyy-MM-dd&quot;);//此IP访问时的服务器时间&nbsp;</p><p>&nbsp;&nbsp;SqlDBManager db = new SqlDBManager(System.Configuration.ConfigurationSettings.AppSettings[&quot;ConnString&quot;].ToString());<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;System.Data.SqlClient.SqlDataReader sdr = db.Select(&quot;select top 1 _time from ipday order by _time desc&quot;);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;try<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;if(sdr.HasRows)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(sdr.Read())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temptime = Convert.ToString(sdr.GetDateTime(0));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;finally<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;sdr.Close();<br />&nbsp;&nbsp;&nbsp;db.ConnClose();<br />&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;if(temptime == null || temptime == &quot;&quot;)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;temptime = time;<br />&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;DateTime dt = Convert.ToDateTime(time);//转换当前服务器时间 为时间型<br />&nbsp;&nbsp;DateTime tempdt = Convert.ToDateTime(temptime);//转换当前IP数据时间 为时间型</p><p>&nbsp;&nbsp;if(dt == tempdt)&nbsp; //服务器时间与IP数据时间相同 说明是当天的点击<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;IPRequest();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if(dt &gt; tempdt) //服务器时间&gt;IP数据时间 说明是第二天的点击 获得前一天的点击总数存入iprecord表 并删除ipday中前一天的所有记录<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;int topnum = 0;<br />&nbsp;&nbsp;&nbsp;System.Data.SqlClient.SqlDataReader sdr1 = db.Select(&quot;select sum(num) from ipday&quot;);<br />&nbsp;&nbsp;&nbsp;try<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(sdr1.HasRows)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(sdr1.Read())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;topnum=sdr1.GetInt32(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;finally<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;sdr1.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;db.ConnClose();<br />&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;db.Delete(&quot;delete from ipday where _time='&quot;+temptime+&quot;'&quot;);<br />&nbsp;&nbsp;&nbsp;db.Insert(&quot;insert into iprecord(_time,topnum) values ('&quot;+temptime+&quot;',&quot;+topnum+&quot;)&quot;);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IPRequest();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;}<br />&nbsp;catch(Exception ex)<br />&nbsp;{<br />&nbsp;&nbsp;throw(ex);<br />&nbsp;}<br />}</p><p>private void IPRequest()<br />{<br />&nbsp;bool b = db.CheckEnable(&quot;ip&quot;,ip,&quot;ipday&quot;);//检验此IP 今天是否访问过 表中存在为false 不存在为true</p><p>&nbsp;if(b == false)&nbsp;&nbsp;&nbsp; //此IP今天访问过<br />&nbsp;{<br />&nbsp;&nbsp;int n = Convert.ToInt32(db.AnyKey(&quot;num&quot;,&quot;ip&quot;,ip,&quot;ipday&quot;));//获得此IP 今天的访问次数<br />&nbsp;&nbsp;if(n == 3)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;Response.Write(&quot;&lt;script&gt;alert('你已经点了3次了,一天只能点3次');&lt;/script&gt;&quot;);<br />&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else if(n&lt;3)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;n++;<br />&nbsp;&nbsp;&nbsp;db.Update(&quot;update ipday set num=&quot;+n);<br />&nbsp;&nbsp;&nbsp;Response.Write(&quot;&lt;script language=javascript&gt;window.open('目标页.aspx');&lt;/script&gt;&quot;);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;else&nbsp; //此IP今天没有访问过<br />&nbsp;{<br />&nbsp;&nbsp;db.Insert(&quot;insert into ipday(ip,_time,num) values ('&quot;+ip+&quot;','&quot;+time+&quot;',1)&quot;);<br />&nbsp;&nbsp;Response.Write(&quot;&lt;script language=javascript&gt;window.open('目标页.aspx');&lt;/script&gt;&quot;);<br />&nbsp;}<br />}<br />&nbsp;</p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/53.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=53</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=53&amp;key=93aea5e7</trackback:ping></item><item><title>给Repeater、Datalist、Datagrid 增加自动编号</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/52.html</link><pubDate>Mon, 22 Feb 2010 23:26:53 +0800</pubDate><guid>http://www.dazix.cn/post/52.html</guid><description><![CDATA[<p><strong>一、正序</strong><br />A、AllowPaging=False 使用以下方法：<br />&lt;asp:DataGrid id=&quot;DataGrid1&quot; runat=&quot;server&quot;&gt;<br />&nbsp;&lt;Columns&gt;<br />&nbsp;&nbsp;&lt;asp:TemplateColumn&gt;<br />&nbsp;&nbsp;&nbsp;&lt;ItemTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;%# Container.ItemIndex + 1%&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/ItemTemplate&gt;<br />&nbsp;&nbsp;&lt;/asp:TemplateColumn&gt;<br />&nbsp;&lt;/Columns&gt;<br />&lt;/asp:DataGrid&gt;</p><p>还可以:<br />&lt;asp:DataGrid id=&quot;DataGrid1&quot; runat=&quot;server&quot;&gt;<br />&nbsp;&lt;Columns&gt;<br />&nbsp;&nbsp;&lt;asp:TemplateColumn&gt;<br />&nbsp;&nbsp;&nbsp;&lt;ItemTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;%# this.DataGrid1.Items.Count + 1%&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/ItemTemplate&gt;<br />&nbsp;&nbsp;&lt;/asp:TemplateColumn&gt;<br />&nbsp;&lt;/Columns&gt;<br />&lt;/asp:DataGrid&gt;</p><p>为什么Items.Count会这样,而不是得出全部总合,但如果了解绑定过程就容易理解。[从上面来看就是在 ItemCreated 事件中进行绑定所以得到的 Items.Count 刚好是当前的序号]</p><p>B、AllowPaging=&quot;True&quot;下，如果<a title="datagrid" href="http://www.dazix.cn/catalog.asp?tags=datagrid">DataGrid</a>支持分页则可以如下：<br />&lt;asp:DataGrid id=&quot;DataGrid1&quot; runat=&quot;server&quot; AllowPaging=&quot;True&quot;&gt;<br />&nbsp;&lt;Columns&gt;<br />&nbsp;&nbsp;&lt;asp:TemplateColumn&gt;<br />&nbsp;&nbsp;&nbsp;&lt;ItemTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;%# this.DataGrid1.CurrentPageIndex * this.DataGrid1.PageSize + Container.ItemIndex + 1%&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;//如果使用aspnetpager分页则<br />&nbsp;&nbsp;&nbsp;&nbsp;//&lt;%# (this.AspNetPager1.CurrentPageIndex-1) * this.AspNetPager1.PageSize + Container.ItemIndex + 1 %&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&lt;/ItemTemplate&gt;<br />&nbsp;&nbsp;&lt;/asp:TemplateColumn&gt;<br />&nbsp;&lt;/Columns&gt;<br />&lt;/asp:DataGrid&gt;</p><p><strong>二、倒序的方法 </strong></p><p>由上面可以知道使用 this.DataGrid1.Items.Count - Container.ItemIndex + 1 方法是不可能实现的,得到值全会为1,分页的情况下更是一样.所以一开始就要取得数据源的行数:</p><p>private int rowscount = 0;<br />protected int RowsCount<br />{<br />&nbsp;get{ return rowscount;}<br />&nbsp;set{ this.rowscount = value; }<br />}</p><p>private void Page_Load(object sender, System.EventArgs e)<br />{<br />&nbsp;// 在此处放置用户代码以初始化页面<br />&nbsp;if(!IsPostBack)<br />&nbsp;&nbsp;this.BindData();<br />}</p><p>private void BindData()<br />{<br />&nbsp;SqlConnection cn = new SqlConnection(&quot;server=(local);database=NorthWind;uid=sa;pwd=&quot;);<br />&nbsp;string str=@&quot;SELECT Employees.EmployeeID, Orders.EmployeeID&nbsp;FROM Employees INNER JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID &quot;;<br />&nbsp;SqlDataAdapter sqlda = new SqlDataAdapter(str,cn);<br />&nbsp;DataSet ds = new DataSet();<br />&nbsp;sqlda.Fill(ds);<br />&nbsp;<br />&nbsp;this.RowsCount = ds.Tables[0].Rows.Count;<br />&nbsp;this.DataGrid1.DataSource = ds;<br />&nbsp;this.DataGrid1.DataBind();<br />}</p><p>&lt;asp:DataGrid id=&quot;DataGrid1&quot; runat=&quot;server&quot; AllowPaging=&quot;True&quot;&gt;<br />&nbsp;&lt;Columns&gt;<br />&nbsp;&nbsp;&lt;asp:TemplateColumn&gt;<br />&nbsp;&nbsp;&nbsp;&lt;ItemTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;%# RowsCount - DataGrid1.CurrentPageIndex * DataGrid1.PageSize - Container.ItemIndex %&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/ItemTemplate&gt;<br />&nbsp;&nbsp;&lt;/asp:TemplateColumn&gt;<br />&nbsp;&lt;/Columns&gt;<br />&lt;/asp:DataGrid&gt;</p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/52.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=52</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=52&amp;key=bb802002</trackback:ping></item><item><title>ASP.Net 更新页面输出缓存的几种方法（包括用户控件，iframe，页面缓存等）</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/42.html</link><pubDate>Fri, 06 Nov 2009 12:29:57 +0800</pubDate><guid>http://www.dazix.cn/post/42.html</guid><description><![CDATA[<p><a title="c#/asp.net" href="http://www.dazix.cn/catalog.asp?cate=1">ASP.Net </a>自带的<a title="缓存机制" href="http://www.dazix.cn/search.asp?q=%E7%BC%93%E5%AD%98">缓存机制</a>对于提高页面性能有至关重要的作用，另一方面，缓存的使用也会造成信息更新的延迟。如何快速更新缓存数据，有时成了困扰程序员的难题。<br /><strong>（1）Cache 对象缓存</strong><br />Cache 对象提供代码级的缓存，功能强大，可操作性强。更新这种缓存的方法很简单，只要调用 Cache.Remove(key) 方法就可以清除指定的缓存。代码如下：</p><p>HttpRuntime.Cache.Remove(cacheEnmu.Key.ToString());</p><p>下列代码清空所有 Cache 缓存：</p><p>IDictionaryEnumerator cacheEnmu = HttpRuntime.Cache.GetEnumerator();<br />while (cacheEnmu.MoveNext())<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; HttpRuntime.Cache.Remove(cacheEnmu.Key.ToString());<br />}</p><p><strong>（2）页面级缓存 OutputCache</strong><br />相对 Cache 对象，页面级的 OutputCache 的使用要容易得多，且无需改动页面代码，只要在页面顶部增加 &lt;%@ OutputCache %&gt; 声明就可以缓存当前页的所有内容。当然有利必有弊，OutputCache 只提供有限的几个参数，当需要清除缓存时就不如 Cache 对象那么灵活。不过仍然有办法，.Net 提供了 RemoveOutputCacheItem() 方法来清空页面级输出缓存，使用方法如下：</p><p>HttpResponse.RemoveOutputCacheItem(fname);<br />//fname 是待清除缓存页面的绝对路径，如 /article/read.aspx</p><p><strong>（3）用户控件级缓存 OutputCache</strong><br />用户控件级缓存和页面级缓存类似，不同的是可以只缓存页面局部的用户控件，对于不需要整页缓存的页面来说是种不错的解决方案。可是清空页面缓存的 RemoveOutputCacheItem() 方法对用户控件却无效。查阅了很多资料，结论是 .net 没有提供直接清空用户控件输出缓存的方法。我的方法是采用 OutputCache 依赖项变通处理，OutputCache 有一个 VaryByCustom 参数，用于为缓存指定自定义的依赖项，当该项内容变动时就会更新缓存。要使用 VaryByCustom 参数需要重写 Global.asax 的 GetVaryByCustomString() 方法，简单的代码如下：<br />//arg 是系统传入的自定义变量名，需要在下面进行判断//DataCache 是一个缓存类，这里用于存取 Cache 对象，当更新该Cache对象时，页面缓存同时更新</p><p>public override string GetVaryByCustomString(HttpContext context, string arg)<br />{&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; if(arg == &quot;ucCacheFlag&quot;)&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object _flag = DataCache.GetCache(&quot;ucCacheFlag&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(_flag == null)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_flag = DateTime.Now.Ticks.ToString();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataCache.SetCache( &quot;ucCacheFlag&quot;, _flag, DateTime.Now.AddMinutes(CommonValue.CacheTime), TimeSpan.Zero);&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _flag.ToString();&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; return base.GetVaryByCustomString(context, arg);<br />}</p><p>同时在用户控件的头部声明中加入：</p><p>&lt;%@ OutputCache Duration=&quot;1800&quot; VaryByCustom=&quot;ucCacheFlag&quot; %&gt;<br />//ucCacheFlag 就是在GetVaryByCustomString()中判断的字符串</p><p>只需在程序中更新 key 为 ucCacheFlag 的 Cache，页面输出缓存也会相应更新。可以在 GetVaryByCustomString() 中判断多个关键字，以控制不同的用户控件输出缓存。<br />（4）iframe 中的缓存问题<br />嵌入 iframe 或网页模式对话框中的页面会自动产生输出缓存，导致内部页不能实时，这是IE自带的<a title="缓存机制" href="http://www.dazix.cn/search.asp?q=%E7%BC%93%E5%AD%98">缓存机制</a>，严格来说与 <a title="c#/asp.net" href="http://www.dazix.cn/catalog.asp?cate=1">ASP.Net</a> 无关。不过在 .Net 中我们可以通过简单的代码解决这个问题。<br />在程序的开头部分加入下面的代码，可以设置 HTTP 请求立刻更新，阻止 IE 对页面进行缓存。</p><p>Response.Expires = -1;</p><p>常见的缓存问题就是以上四种.<br />&nbsp;</p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/42.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=42</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=42&amp;key=c64d8439</trackback:ping></item><item><title>ParameterDirection.ReturnValue 用法</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/41.html</link><pubDate>Mon, 26 Oct 2009 14:26:22 +0800</pubDate><guid>http://www.dazix.cn/post/41.html</guid><description><![CDATA[<p>&nbsp;c# code:</p><p>SqlCommand mycom = usercommon.createcommand();<br />mycom.CommandText = &quot;ModifyUserPwd&quot;;<br />SqlParameter[] parm = {<br />&nbsp;&nbsp;&nbsp; new SqlParameter(&quot;@username&quot;, SqlDbType.VarChar, 50),<br />&nbsp;&nbsp;&nbsp; new SqlParameter(&quot;@userpwd&quot;, SqlDbType.VarChar, 50),<br />&nbsp;&nbsp;&nbsp; new SqlParameter(&quot;@newpwd&quot;, SqlDbType.VarChar, 50),<br />&nbsp;&nbsp;&nbsp; new SqlParameter(&quot;@returnvalue&quot;,SqlDbType.Int)<br />&nbsp;&nbsp;&nbsp; };&nbsp;<br />parm[0].Value=username;<br />parm[1].Value=oldpwd;<br />parm[2].Value=newpwd;<br />parm[3].Direction = ParameterDirection.ReturnValue;<br />usercommon.AttachParameters(mycom,parm);<br />mycom.ExecuteNonQuery();<br />int i =(Int32) mycom.Parameters[&quot;@returnvalue&quot;].Value;<br />usercommon.CloseConn();<br />return i;</p><p><a title="存储过程" href="http://www.dazix.cn/search.asp?q=%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B">存储过程</a></p><p>alter proc ModifyUserPwd<br />(<br />@username varchar(50),<br />@userpwd varchar(50),<br />@newpwd varchar(50)<br />)<br />as<br />declare @pwd varchar(50)<br />select @pwd=userpwd from users<br />if(@pwd=@userpwd)<br />begin<br />update users set userpwd=@newpwd where username=@username<br />return 1<br />end<br />else<br />return 0<br />go</p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/41.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=41</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=41&amp;key=512a20b1</trackback:ping></item><item><title>ASPNET 页面 生命周期</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/37.html</link><pubDate>Wed, 21 Oct 2009 13:05:55 +0800</pubDate><guid>http://www.dazix.cn/post/37.html</guid><description><![CDATA[<p>页面框架通过如下过程处理aspx文件请求:<br />1：解析aspx文件,并创建一个控件树；<br />2：使用控件树动态实现一个继承自Page类的类或者控件&nbsp;；<br />3：动态编译类；<br />4：缓存编译类，以备后用；<br />5：动态创建一个编译类的实例。页面开始启动生命期，在这个过程中，页面将通过<a title="生命周期" href="http://www.dazix.cn/catalog.asp?tags=生命周期">生命周期</a>的不同阶段；</p><p>页面经历了如下阶段【其中一些阶段标记为仅仅回传，是说只有在被回传到服务器时，页面才经历这些阶段】：</p><p>01:页面首先从QueryString或者Request对象的Form集合中获得回传数据。</p><p>02:页面检测回传数据集合(NameValueCollection,Form或者QueryString)是否包含一个键为_CallBackId的项。如&nbsp;果存在，那么设置其Boolean属性IsCallBack为True,以便通过AspNet客户端回调机制，标明页面已经回传到服务器。</p><p><b>03:预初始化(PreInit)：</b><br />在页面<a title="生命周期" href="http://www.dazix.cn/catalog.asp?tags=生命周期">生命周期</a>的预初始化阶段执行如下操作：<br />a:调用On<wbr></wbr>PreInit方法引发PreInit事件。<br />b:利用App_Themes目录中的内容初始化主题，以动态实现一个PageTheme类型的类，<br />编译该类，并创建一个编译类的实例，接着将实例赋值给它的PageTheme属性值<br />c:应用母版页</p><p><b>04:初始化(Init)：<br /></b>在页面<a title="生命周期" href="http://www.dazix.cn/catalog.asp?tags=生命周期">生命周期</a>的初始化阶段执行以下操作<br />a:递归初始化Controls集合中的控件。初始化包括设置这些控件的属性，<br />例如：Page,Id和NameContainer等<br />b:递归应用控件皮肤<br />c:调用On<wbr></wbr>Init方法以引发自身的Init事件，接着递归调用子控件的On<wbr></wbr>Init方法来引发它们的Init事件<br />d:调用自身的TrackViewState方法来启动自身的视图状态跟踪，接着递归调用子控件<br />的TrackViewState方法来启动它们的视图状态跟踪。</p><p><b>05:完成初始化(InitComplete):</b><br />页面调用On<wbr></wbr>InitComplete方法来引发InitComplete事件。该事件标明了初始化阶段的结束。<br />此时，页面Controls集合的所有控件都被初始化了。</p><p><b>06:加载控件状态(Load&nbsp;Control&nbsp;State)[PostBack&nbsp;On<wbr></wbr>ly]:</b><br />页面递归调用Control集合中控件的LoadControlState方法，这些控件已经调用了Page类<br />的RegisterRequiresControlState方法，以使用它们的控件状态。</p><p><b>07:加载视图状态(Load&nbsp;View&nbsp;State)[PostBack&nbsp;On<wbr></wbr>ly]:</b><br />页面首先调用自身的LoadViewState方法，接着递归调用Controls集合控件的LoadViewState方法，以允许它们加载它们的已经保存的视图状态。</p><p><b>08:加载回传数据(Load&nbsp;Post&nbsp;Da<wbr></wbr>ta)[PostBack&nbsp;On<wbr></wbr>ly]:</b><br />页面调用实现IPostBackDataHandler接口的控件的LoadPostData方法，并将回传数据传递给该方法。每个控件的LoadPostDate方法都必须访问回传数据，并据此更新相应的控件属性。<br />例如：TextBox控件的LoadPostData方法将文本框的新值设置为TextBox控件的Text属性值。</p><p><b>09:预加载(PreLoad):</b><br />页面调用On<wbr></wbr>PreLoad方法以引发PreLoad事件。该事件表示页面<a title="生命周期" href="http://www.dazix.cn/catalog.asp?tags=生命周期">生命周期</a>将进入加载阶段。</p><p><b>10:加载(Load):</b><br />页面首先调用自身的On<wbr></wbr>Load方法以引发自身的Load事件，接着递归调用Controls集合中控件的On<wbr></wbr>Load方法以引发它们的Load事件。页面开发人员可以为Load事件注册回调，那么就可以通过编程将子控件添加到页面的Controls集合中。</p><p><b>11:加载回传数据(Load&nbsp;Post&nbsp;Da<wbr></wbr>ta)[PostBack&nbsp;On<wbr></wbr>ly&nbsp;Second&nbsp;Try]:</b><br />页面调用控件的LoadPostBack方法。这些控件如果实现了IPostBackDataHandler接口，那么在加载阶段，它们已通过编程添加到Controls集合中。</p><p><b>12:引发回传数据修改事件(Raise&nbsp;Post&nbsp;Da<wbr></wbr>ta&nbsp;Changed&nbsp;Event)[PostBack&nbsp;On<wbr></wbr>ly]:</b><br />页面调用控件的RaisePostDataChangeEvent方法，这些控件的LoadPostData方法返回true。<br />RaisePostDataChangeEvent方法引发了回传数据修改事件。例如：当文本框的新值与旧值<br />不同时，那么TextBox控件将引发该事件。</p><p><b>13:引发回传事件(Raise&nbsp;PostBack&nbsp;Event)[PostBack&nbsp;On<wbr></wbr>ly]:</b><br />页面调用控件的RaisePostEvent方法，这些控件相关的Html元素用于提交表单。例如，Button控件的相关Html元素将页面回传到服务器。控件的RaisePostBackEvent方法必须将回传事件映射到一个或多个服务器事件。例如，Button控件的RaisePostBackEvent方法将事件映射到了服务器端事件Command和Click上。</p><p><b>14:完成加载(Load&nbsp;Complete):</b><br />页面调用On<wbr></wbr>LoadComplete方法来引发LoadComplete事件，这表示所有加载活动，包括加载回传数据，以及引发回传数据修改事件，并以更新控件自身的活动都完成了。</p><p><b>15:引发回调事件(Raise&nbsp;CallBack&nbsp;Event)(PostBack&nbsp;And&nbsp;CallBack&nbsp;On<wbr></wbr>ly):</b><br />页面调用控件的RaiseCallBackEvent方法。该控件可使用AspNet客户端回调机制来允许客户端方法(例如JavaS<wbr></wbr>cript函数)调用服务器端方法，而无需将整个页面回传给服务器。<br />RaiseCallBackEvent方法必须调用服务器端方法。如果页面的回传使用了客户端回调机制，那么页面将不会执行剩余的页面<a title="生命周期" href="http://www.dazix.cn/catalog.asp?tags=生命周期">生命周期</a>阶段。</p><p><b>16:预呈现(PreRender):</b><br />在页面<a title="生命周期" href="http://www.dazix.cn/catalog.asp?tags=生命周期">生命周期</a>这个阶段执行一下操作。<br />a:调用EnsureChildControls方法来确保在页面进入呈现阶段之前，创建其子控件。<br />b:调用自身的On<wbr></wbr>PreRender方法来引发PreRender事件。<br />c:递归调用Controls集合中控件的On<wbr></wbr>PreRender方法，以引发它们的PreRender事件。</p><p><b>17:预呈现完成(PreRender&nbsp;Complete):</b><br />页面调用On<wbr></wbr>PrerenderComplete方法来引发PreRenderComplete事件，这表示所有预呈现活动完成了。</p><p><b>18:保存控件状态(Save&nbsp;Control&nbsp;State):&nbsp;</b><br />页面递归调用Controls集合中控件的SaveControlState方法。这些控件已经调用了Page类的RegisterRequiresControlState方法来保存它们的控件状态。&nbsp;</p><p><b>19:保存视图状态(Save&nbsp;View&nbsp;State):<br /></b>页面首先调用自身的SaveViewState方法，然后调用Controls集合中的SaveViewState方法，以允许它们来保存其视图状态。</p><p><b>20:保存状态完成(Save&nbsp;View&nbsp;Complete):<br /></b>页面调用On<wbr></wbr>SaveStateComplete方法以引发SaveStateComplete事件，这表示所有状态保存活动都完成了。</p><p><b>21:呈现：<br /></b>在页面<a title="生命周期" href="http://www.dazix.cn/catalog.asp?tags=生命周期">生命周期</a>的这个阶段执行一下操作。<br />a:创建一个HtmlTextWriter类实例，该实例封装了输出响应流<br />b:调用RenderCOntrol方法，并将HtmlTextWriter实例传递给该方法。<br />RenderControl方法递归调用子控件的RenderControl方法，以便允许每个控件能够呈现其<br />Html标记文本。子控件的Html标记文本组成了最终发送给客户端浏览器的Html标记文本。</p><p><table style="table-layout: fixed; width: 100%">    <tbody>        <tr>            <td>            <div class="cnt" id="blog_text">            <div class="postbody"><span style="color: #0000ff"><font color="#0000ff">using</font></span><font color="#0000ff"><span style="color: #000000"> System;<br />            </span><span style="color: #0000ff">using</span></font><font color="#0000ff"><span style="color: #000000"> System.Data;<br />            </span><span style="color: #0000ff">using</span></font><font color="#0000ff"><span style="color: #000000"> System.Configuration;<br />            </span><span style="color: #0000ff">using</span></font><font color="#0000ff"><span style="color: #000000"> System.Web;<br />            </span><span style="color: #0000ff">using</span></font><font color="#0000ff"><span style="color: #000000"> System.Web.Security;<br />            </span><span style="color: #0000ff">using</span></font><font color="#0000ff"><span style="color: #000000"> System.Web.UI;<br />            </span><span style="color: #0000ff">using</span></font><font color="#0000ff"><span style="color: #000000"> System.Web.UI.WebControls;<br />            </span><span style="color: #0000ff">using</span></font><font color="#0000ff"><span style="color: #000000"> System.Web.UI.WebControls.WebParts;<br />            </span><span style="color: #0000ff">using</span></font><font color="#0000ff"><span style="color: #000000"> System.Web.UI.HtmlControls;<br />            <br />            </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">partial</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span></font><font color="#0000ff"><span style="color: #000000"> _Default : Page <br />            {<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Page_Load(</span><span style="color: #0000ff">object</span></font><font color="#0000ff"><span style="color: #000000"> sender, EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000"> OnPreInit 第一步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnPreInit(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">检查 IsPostBack 属性来确定是不是第一次处理该页。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">创建或重新创建动态控件。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">动态设置主控页。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">动态设置 Theme 属性。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">读取或设置配置文件属性值。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">注意&nbsp;&nbsp;<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果请求是回发请求，则控件的值尚未从视图状态还原。如果在此阶段设置控件属性，则其值可能会在下一事件中被重写。</span></font><span style="color: #008000"><br />            </span><font color="#0000ff"><span style="color: #000000"><br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span></font><font color="#0000ff"><span style="color: #000000">.OnPreInit(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> OnInit 第二步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnInit(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。</span></font><span style="color: #008000"><br />            </span><font color="#0000ff"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span></font><font color="#0000ff"><span style="color: #000000">.OnInit(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> OnInitComplete 第三步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnInitComplete(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。</span></font><span style="color: #008000"><br />            </span><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff"><font color="#0000ff">base</font></span><font color="#0000ff"><span style="color: #000000">.OnInitComplete(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> PreLoad 第四步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnPreLoad(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">如果需要在 Load 事件之前对页或控件执行处理，请使用该事件。 <br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在 Page 引发该事件后，它会为自身和所有控件加载视图状态，然后会处理 Request 实例包括的任何回发数据。</span></font><span style="color: #008000"><br />            </span><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff"><font color="#0000ff">base</font></span><font color="#0000ff"><span style="color: #000000">.OnPreLoad(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"> </span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> OnLoad 第五步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnLoad(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">Page 在 Page 上调用 OnLoad 事件方法，然后以递归方式对每个子控件执行相同操作，如此循环往复，直到加载完本页和所有控件为止。<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。</span></font><span style="color: #008000"><br />            </span><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff"><font color="#0000ff">base</font></span><font color="#0000ff"><span style="color: #000000">.OnLoad(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> 控件事件 第六步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Button1_Click(</span><span style="color: #0000ff">object</span></font><font color="#0000ff"><span style="color: #000000"> sender, EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">用这些事件来处理特定控件事件，如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">注意&nbsp;&nbsp;<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在回发请求中，如果页包含验证程序控件，请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。</span></font><span style="color: #008000"><br />            </span><font color="#0000ff"><span style="color: #000000"><br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> OnLoadComplete 第七步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnLoadComplete(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">对需要加载页上的所有其他控件的任务使用该事件。</span></font><span style="color: #008000"><br />            </span><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff"><font color="#0000ff">base</font></span><font color="#0000ff"><span style="color: #000000">.OnLoadComplete(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> OnPreRender 第八步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnPreRender(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">在该事件发生前：<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">Page 对象会针对每个控件和页调用 EnsureChildControls。 <br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息，请参见下面的数据绑定控件的数据绑定事件。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。</span></font><span style="color: #008000"><br />            </span><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff"><font color="#0000ff">base</font></span><font color="#0000ff"><span style="color: #000000">.OnPreRender(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"> </span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> SaveStateComplete 第九步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnSaveStateComplete(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">在该事件发生前，已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">使用该事件执行满足以下条件的任务：要求已经保存了视图状态，但未对控件进行任何更改。</span></font><span style="color: #008000"><br />            </span><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff"><font color="#0000ff">base</font></span><font color="#0000ff"><span style="color: #000000">.OnSaveStateComplete(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span></font><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> Render 第十步</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #008000"><font color="#0000ff">//</font></span><font color="#0000ff"><span style="color: #008000">Render<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">这不是事件；在处理的这个阶段，Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">如果创建自定义控件，通常要重写此方法以输出控件的标记。不过，如果自定义控件只合并标准的 ASP.NET Web 服务器控件，不合并自定义标记，则不需要重写 Render 方法。有关更多信息，请参见开发自定义 ASP.NET 服务器控件。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户控件（.ascx 文件）自动合并呈现，因此不需要在代码中显式呈现该控件。</span></font><span style="color: #008000"><br />            </span><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff"><font color="#0000ff">#endregion</font></span><span style="color: #000000"><br />            <br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">#region</span><span style="color: #000000"> OnUnload 第十一步&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font><span style="color: #000000"><br />            <font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#0000ff"><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span></font><font color="#0000ff"><span style="color: #000000"> OnUnload(EventArgs e)<br />            &nbsp;&nbsp;&nbsp;&nbsp; {<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">该事件首先针对每个控件发生，继而针对该页发生。在控件中，使用该事件对特定控件执行最后清理，如关闭控件特定数据库连接。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">对于页自身，使用该事件来执行最后清理工作，如：关闭打开的文件和数据库连接，或完成日志记录或其他请求特定任务。<br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span></font><font color="#0000ff"><span style="color: #008000">注意&nbsp;&nbsp;<br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在卸载阶段，页及其控件已被呈现，因此无法对响应流做进一步更改。如果尝试调用方法（如 Response.Write 方法），则该页将引发异常。</span></font><span style="color: #008000"><br />            </span><font color="#0000ff"><span style="color: #000000"><br />            <br />            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span></font><font color="#0000ff"><span style="color: #000000">.OnUnload(e);<br />            &nbsp;&nbsp;&nbsp;&nbsp; }<br />            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span></font><span style="color: #000000"><br />            <font color="#0000ff">}<br />            </font></span></div>            </div>            </td>        </tr>    </tbody></table></p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/37.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=37</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=37&amp;key=335bc20d</trackback:ping></item><item><title>使用 StateServer 保存 Session 解决 Session过期，登陆过期问题。</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/36.html</link><pubDate>Mon, 12 Oct 2009 09:12:20 +0800</pubDate><guid>http://www.dazix.cn/post/36.html</guid><description><![CDATA[<p>使用 <a title="StateServer" href="http://www.dazix.cn/catalog.asp?tags=StateServer">StateServer </a>保存 <strong>Session </strong>正常操作情况下Session会无故丢失。因为程序是在不停的被操作，排除Session超时的可能。另外，Session超时时间被设定成60分钟，不会这么快就超时的。&nbsp;&nbsp; <br />&nbsp; <br />原因：由于Asp.net程序是默认配置，所以Web.Config文件中关于Session的设定如下：</p><p>&lt;sessionState&nbsp;mode='InProc stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/&gt;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; <br />在sessionState标签中有个属性mode，它可以有3种取值：InProc、StateServer、<a target="_blank" href="http://www.dazix.cn/catalog.asp?tags=SQL">SQLServer</a>（大小写敏感）。默认情况下是InProc，也就是将Session保存在进程内（IIS5是aspnet_wp.exe，而IIS6是W3wp.exe），这个进程不稳定，在某些事件发生时，进程会重起，所以造成了存储在该进程内的Session丢失。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />哪些情况下该进程会重起呢？微软的一篇文章告诉了我们：&nbsp;&nbsp; <br />&nbsp;&nbsp; 1、配置文件中processModel标签的memoryLimit属性&nbsp;&nbsp; <br />&nbsp;&nbsp; 2、Global.asax或者Web.config文件被更改&nbsp;&nbsp; <br />&nbsp;&nbsp; 3、Bin文件夹中的Web程序（DLL）被修改&nbsp;&nbsp; <br />&nbsp;&nbsp; 4、杀毒软件扫描了一些.config文件。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 解决办法：&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; 前面说到的sessionState标签中mode属性可以有三个取值，除了InProc之外，还可以为StateServer、<a target="_blank" href="http://www.dazix.cn/catalog.asp?tags=SQL">SQLServer</a>。这两种存Session的方法都是进程外的，所以当aspnet_wp.exe重起的时候，不会影响到Session。&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; 现在请将mode设定为StateServer。StateServer是本机的一个服务，可以在系统服务里看到服务名为ASP.NET&nbsp;State&nbsp;Service的服务，默认情况是不启动的。当设定mode为<a title="StateServer" href="http://www.dazix.cn/catalog.asp?tags=StateServer">StateServer</a>之后，手工将该服务启动。&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; 这样，就能利用本机的StateService来存储Session了，除非电脑重启或者StateService崩掉，否则Session是不会丢的（因Session超时被丢弃是正常的）。&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; 除此之外，还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中，有个stateConnectionString='tcpip=127.0.0.1:42424'属性，其中有个ip地址，默认为本机（127.0.0.1），可以将其改成你所知的运行了StateService服务的电脑IP，这样就可以实现位于不同电脑上的Asp.net程序互通Session了。&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; 如果你有更高的要求，需要在服务期重启时Session也不丢失，可以考虑将mode设定成<a target="_blank" href="http://www.dazix.cn/catalog.asp?tags=SQL">SQLServer</a>，同样需要修改sqlConnectionString属性。关于使用<a target="_blank" href="http://www.dazix.cn/catalog.asp?tags=SQL">SQLServer</a>保存Session的操作，请访问这里。&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; 在使用StateServer或者<a target="_blank" href="http://www.dazix.cn/catalog.asp?tags=SQL">SQLServer</a>存储Session时，所有需要保存到Session的对象除了基本数据类型（默认的数据类型，如int、string等）外，都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。&nbsp;&nbsp; <br />&nbsp;&nbsp; 如：&nbsp;&nbsp; <br />&nbsp;&nbsp; [Serializable]&nbsp;&nbsp; <br />&nbsp;&nbsp; public&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp; MyClass&nbsp;&nbsp; <br />&nbsp;&nbsp; {&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......&nbsp;&nbsp; <br />&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;</p><p>ASP.NET 使用mode=&quot;InProc&quot;方式保存Session老是丢失，无奈改成StateServer 模式。</p><p>session是工作在你的应用程序进程中的。asp.net进程、iis往往会在20分钟之后重启相关的应用程序，缓冲池满了（例如100个之后）也会重启，各种进程保护措施都会随时重新启动，因此InProc方式丢失session是很正常的事。csdn上明确告诉了这种模式只能保存&ldquo;易失的、暂时的 &rdquo;变量，这是cache没有之前的一种解决方案。而长期保持的数据就要保存在外部数据源中。状态服务器就是一种进程外的数据源。</p><p>StateServer 模式的实质是，把Session 存放在一个单独的进程里，此进程独立于 aspnet_wp.exe 或 w3wp.exe 。启用此服务后，在&ldquo;任务管理器&rdquo;中可以看到一个名为 aspnet_state.exe 的进程，下面开始说明一下设置的具体步骤：</p><p>1、 修改注册表（关键步骤，如下图）</p><p>运行 regedit &rarr; 打开注册表 &rarr; 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state \Parameters 节点 &rarr; 将 AllowRemoteConnection 的键值设置成&ldquo;1&rdquo;（1 为允许远程电脑的连接，0 代表禁止）&rarr; 设置 Port (端口号)</p><p>注意事项：</p><p>a)、若ASP.NET State Service 正在运行，修改注册表内容后，则需要重新启动该服务<br />b)、注意端口号的键值是以十六进制储存的，可以使用十进制进行修改，42424 是默认的端口<br />c)、AllowRemoteConnection 的键值设置成&ldquo;1&rdquo;后，意味着允许远程电脑的连接，也就是说只要知道你的服务端口，就可享用你的ASP.NET State Service，即把 Session 存放在你的电脑进程内，因此请大家慎用；键值为&ldquo;0&rdquo;时，仅有stateConnectionString 为&ldquo;tcpip=localhost: 42424&rdquo;与&ldquo;tcpip=127.0.0.1:42424&rdquo;的情况，方可使用ASP.NET State Service</p><p>2、 开启 ASP.NET State Service</p><p>右键点击&ldquo;我的电脑&rdquo;&rarr; 管理 &rarr; 服务与应用程序 &rarr; 服务 &rarr; 双击&ldquo;ASP.NET State Service&rdquo; &rarr; 启动（可设为&ldquo;自动&rdquo;）只要安装了 .Net Framework ，都拥有此服务。</p><p>3、 更改 Web.config</p><p>打开 Web.config &rarr; 找到 &lt;sessionState&gt; 节点内容</p><p>&lt;sessionState mode=&rdquo;InProc&rdquo; stateConnectionString=&rdquo;tcpip=127.0.0.1:42424&Prime; sqlConnectionString=&rdquo;data source=127.0.0.1;Trusted_Connection=yes&rdquo; cookieless=&rdquo;false&rdquo; timeout=&rdquo;20&Prime; /&gt;</p><p>&rarr; 将其改为以下内容</p><p>&lt;sessionState mode=&rdquo;<a title="StateServer" href="http://www.dazix.cn/catalog.asp?tags=StateServer">StateServer</a>&rdquo; stateConnectionString=&rdquo;tcpip=192.168.0.2:42424&Prime; timeout=&rdquo;20&Prime; /&gt;</p><p>注意事项：<br />1、timeout=&rdquo;20&Prime;为Session 20分钟超时<br />2、IP 地址（可以是远程计算机 IP、计算机名称、域名）与端口号，端口号需与ASP.NET State Service 的服务端口一致</p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/36.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=36</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=36&amp;key=be410a39</trackback:ping></item><item><title>aspnet 性能优化</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/30.html</link><pubDate>Thu, 10 Sep 2009 14:14:16 +0800</pubDate><guid>http://www.dazix.cn/post/30.html</guid><description><![CDATA[<p>(一).选择会话状态存储方式<br />&nbsp;&nbsp;&nbsp; 在Webconfig文件配置:<br />&nbsp;&nbsp;&nbsp; &lt;sessionState mode=&quot;???&quot; stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlConnectionString=&quot;data source=127.0.0.1;Trusted_Connection=yes&quot; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookieless=&quot;false&quot; timeout=&quot;20&quot;/&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; <a title="ASPNET" target="ASPNET" href="http://www.dazix.cn/catalog.asp?tags=aspnet">asp.net</a>有三种方式存储会话状态信息: <br />&nbsp;&nbsp;&nbsp; 1. 存储在进程中: 属性mode = InProc<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特点： 具有最佳的性能，速度最快,但不能跨多台服务器存储共享.<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; 2. 存储在状态服务器中: 属性mode = &quot;StateServer&quot; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特点:&nbsp;&nbsp; 当需要跨服务器维护用户会话信息时，使用此方法。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是信息存储在状态服务器上，一旦状态服务器出现故障，信息将丢失<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 3. 存储在sql server中: 属性mode=&quot;SqlServer&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特点:&nbsp;&nbsp; 工作负载会变大，但信息不会丢失.<br />&nbsp;&nbsp;&nbsp; 补充一点：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I. 由于某些页面不需要会话状态，则可以将会话状态禁用:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码如下： &lt;%@ Page EnableSessionState=&quot;false&quot; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; II.如果页面需要访问会话变量但不允许修改它们，可以设置页面会话状态为只读:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码如下： &lt;%@ Page EnableSessionState=&quot;false&quot; %&gt;<br />&nbsp;&nbsp;&nbsp; 使用时可以根据具体情况选择某种方式<br />(二).使用Page.IsPostBack<br />&nbsp;&nbsp;&nbsp; Page.IsPostBack表示是否是从客户端返回的. 初次运行时，不是从客户端返回，它的值<br />&nbsp;&nbsp;&nbsp; 为false,当触发页面上的事件或刷新页面时，Page.IsPostBack由于是回发的，值变为true;<br />&nbsp;&nbsp;&nbsp; 一般在: Page_Load方法中用:<br />&nbsp;&nbsp;&nbsp; private void Page_Load(Object sender,EventArgs e)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!Page.IsPostBack)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....; //初始化页面的代码。这些代码第一次页面初始化时执行，当第二次回发时，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不会再执行。提高效率。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; 往往很多时候不得不用IsPostBack, 因为有些控件初始化后，要保持它的状态.<br />&nbsp;&nbsp;&nbsp; 例如: DropDownList,如果每次都初始化，则用户无论选择其选项，都会被初始化为默认值.<br />(三).避免使用服务器控件<br />&nbsp;&nbsp;&nbsp; 1.一般的静态显示信息，尽量不要用服务端控件显示. 因为服务端控件需要回发服务端执行,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会降低程序执行效率,一般用&lt;DIV&gt;显示即可. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果用了服务端控件，将: runat=&quot;server&quot;去掉,也会提高效率.<br />&nbsp;&nbsp;&nbsp; 2.禁用服务端控件的状态视图，有些控件不需要维护其状态，可以设置其属性: EnableViewState=false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果整个页面控件都不需要维持状态视图，则可以设置整个页面的状态视力为false:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码如下: &lt;%@ Page EnableViewState=&quot;false&quot;%&gt;<br />&nbsp;&nbsp;&nbsp; 3.在Web.Config文件中配置:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a title="ASPNET" href="http://www.dazix.cn/catalog.asp?tags=aspnet">asp.NET</a> Sessionss可以在Web.config或Machine.config中的Sessionsstate元素中配置。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是在 Web.config中的设置的例子：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Sessionsstate timeout=&quot;10&quot; cookieless=&quot;false&quot; mode=&quot;Inproc&quot; /&gt; <br />(四).避免使用DataGrid<br />&nbsp;&nbsp;&nbsp; 大家都知道DataGrid功能强大。但是功能强大的同时，增加了性能上的开销。一般用其它控件: DataList<br />&nbsp;&nbsp;&nbsp; 或Repeater控件能实现的，尽量不用DataGrid.<br />(五).字符串操作<br />&nbsp;&nbsp;&nbsp; 1.避免装箱操作. 装箱操作运行效率比较低.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如运行两个代码段:&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string test=&quot;&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(for int i=0;i&lt;10000;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test = test + i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string test=&quot;&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(for int i=0;i&lt;10000;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test = test + i.ToString();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面的代码段显然效率要高.因为i是整型的，系统要先把i进行装箱转换为string型的，再进行连接. 需要时间<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读者可以Copy到自己机器上测试一下.<br />&nbsp;&nbsp;&nbsp;&nbsp; 2.使用StringBulider类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在进行字符串连接时: string str = str1 + str2 + ....; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般超过三项连接，最好用StringBuilder来代替string类. StringBuilder可以避免重新创建string 对象造成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的性能损失.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般用于组装sql语句时用到: StringBulider.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读者可以到自己机器上测试一下.<br />3.尽量少用: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语句.此语句执行效率比较低.<br />(六).ADO.Net使用方面优化<br />&nbsp;&nbsp;&nbsp;&nbsp; 1.数据库连接打开和关闭。 在需要连接时打开，当访问完数据库要立刻关闭连接.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 举例说明,还是看两个代码段:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds = new DataSet();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection MyConnection = new SqlConnection(&quot;server=localhost; uid=sa; pwd=; database=NorthWind&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand myCommand = new SqlCommand(strSql,MyConnection);&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataAdapter myAdapter=new SqlDataAdapter(queryStr,connectionStr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyConnection.Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;1000;i++)&nbsp;&nbsp; //for循环模拟取得数据前的商业逻辑操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myAdapter.Fill(ds);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;1000;i++)&nbsp;&nbsp; //for循环模拟取得数据后的商业逻辑操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyConnection.Close();&nbsp;&nbsp;&nbsp;&nbsp; //关闭连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; II.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSet ds = new DataSet();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection MyConnection = new SqlConnection(&quot;server=localhost; uid=sa; pwd=; database=NorthWind&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand myCommand = new SqlCommand(strSql,MyConnection);&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataAdapter myAdapter=new SqlDataAdapter(queryStr,connectionStr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;1000;i++)&nbsp;&nbsp; //for循环模拟取得数据前的商业逻辑操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyConnection.Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myAdapter.Fill(ds);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyConnection.Close();&nbsp;&nbsp;&nbsp;&nbsp; //关闭连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;1000;i++)&nbsp;&nbsp; ////for循环模拟取得数据后的商业逻辑操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.Sleep(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示II代码比I代码好的多，I中早早占着连接不放，如果用户很多的话，容易出现连接池满情况。严重时出现死机现象.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.数据库查询<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I. 直接生成sql语句。 sql server每次都要对其进行编译，在性能方面不会有很大的提高。另外也不够安全。容易被攻击.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; II. 使用带参数的sql命令。这种方式sql server只对其编译一次，对于不同的参数可以重复使用编译后的命令。提高了性能.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; III.使用sql server存储过程. 编译一次. 具有独立性，便于修改和维护. 一次能完成用语句发送多次的功能.减少了网络的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 流量。 并不一定存储过程一定比语句效率要高，如果商业逻辑很复杂的话，有时候用语句比存储过程效率要高.<br />(六).缓存优化<br />&nbsp;&nbsp;&nbsp;&nbsp; 缓存分为两种：页面缓存和API缓存.<br />&nbsp;&nbsp;&nbsp; 1.使用页面缓存和片段缓存 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%@ OutputCache Duration=&quot;5&quot; VaryByParam=&quot;None&quot;%&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%@ OutputCache Duration=60 VaryByParam=&rdquo;TextBox1,TextBox2&rdquo; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明: Duration是设置Cache的过期时间;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VarByParam是设置是否根据参数而变化,None时所有参数使用同一Cache, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置TextBox1时则根据TextBox1的不同值分别缓存;当有多个参数时则要组合缓存;<br />&nbsp;&nbsp;&nbsp; 2.API缓存。用于在应用程序中使用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I. 一个Cache使用的例子:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://blog.csdn.net/chengking/archive/2005/10/03/494545.aspx">http://blog.csdn.net/chengking/archive/2005/10/03/494545.aspx</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; II.使用时注意Page.Cache和HttpContext.Current.Cache区别:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它们指的同一个对象，在Page里，用Page.Cache，如果在global.asax或自己的类里用:HttpContext.Current.Cache 在有些事件中，由于其没有HttpContext，就用HttpRuntime.Cache.</p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/30.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=30</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=30&amp;key=5c6702c3</trackback:ping></item><item><title>web.config</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/28.html</link><pubDate>Thu, 10 Sep 2009 13:52:17 +0800</pubDate><guid>http://www.dazix.cn/post/28.html</guid><description><![CDATA[<p>&nbsp;</p><p><strong>一、认识Web.config文件<br /></strong>Web.config 文件是一个xml文本文件，它用来储存 asp.NET Web 应用程序的配置信息（如最常用的设置asp.NET Web 应用程序的身份验证方式），它可以出现在应用程序的每一个目录中。当你通过.NET新建一个Web应用程序后，默认情况下会在根目录自动创建一个默认的Web.config文件，包括默认的配置设置，所有的子目录都继承它的配置设置。如果你想修改子目录的配置设置，你可以在该子目录下新建一个Web.config文件。它可以提供除从父目录继承的配置信息以外的配置信息，也可以重写或修改父目录中定义的设置。<br /><strong>&nbsp;(一).Web.Config是以xml文件规范存储,配置文件分为以下格式</strong><br />1.配置节处理程序声明<br />特点：位于配置文件的顶部，包含在&lt;configSections&gt;标志中。<br />2.特定应用程序配置<br />特点: 位于&lt;appSetting&gt;中。可以定义应用程序的全局常量设置等信息.<br />3.配置节设置<br />特点: 位于&lt;system.Web&gt;节中，控制asp.net运行时的行为.<br />4.配置节组<br />特点: 用&lt;sectionGroup&gt;标记，可以自定义分组，可以放到&lt;configSections&gt;内部或其它&lt;sectionGroup&gt;标记的内部.<br /><strong>(二).配置节的每一节</strong><br />1.&lt;<strong>configuration</strong>&gt;节根元素，其它节都是在它的内部.<br />2.&lt;<strong>appSetting</strong>&gt;节此节用于定义应用程序设置项。对一些不确定设置，还可以让用户根据自己实际情况自己设置<br />用法:<br />I.&lt;appSettings&gt;<br />&lt;add key=&quot;Conntction&quot; value=&quot;server=192.168.85.66;userid=sa;password=;database=Info;&quot;/&gt;<br />&lt;appSettings&gt;<br />定义了一个连接字符串常量，并且在实际应用时可以修改连接字符串，不用修改程式代码.<br />II.&lt;appSettings&gt;<br />&lt;add key=&quot;ErrPage&quot; value=&quot;Error.aspx&quot;/&gt;&lt;appSettings&gt; 定义了一个错误重定向页面.<br />3.&lt;<strong>compilation</strong>&gt;节<br />格式:<br />&lt;compilation <br />defaultLanguage=&quot;c#&quot;<br />debug=&quot;true&quot;<br />/&gt;<br />I.default language: 定义后台代码语言,可以选择c#和vb.net两种语言.<br />IIdebug : 为true时，启动aspx调试；为false不启动aspx调试，因而可以提高应用程序运行时的性能。一般程序员在开发时设置为true,交给客户时设置为false.<br />4.&lt;<strong>customErrors</strong>&gt;节<br />格式:<br />&lt;customErrors <br />mode=&quot;RemoteOnly&quot; <br />defaultRedirect=&quot;error.aspx&quot;<br />&lt;error statusCode=&quot;440&quot; redirect=&quot;err440page.aspx&quot;/&gt;<br />&lt;error statusCode=&quot;500&quot; redirect=&quot;err500Page.aspx&quot;/&gt;<br />/&gt; <br />I.mode : 具有On,Off,RemoteOnly 3种状态。On表示始终显示自定义的信息; Off表示始终显示详细的asp.net错误信息; RemoteOnly表示只对不在本地Web服务器上运行的用户显示自定义信息.<br />II.defaultRedirect: 用于出现错误时重定向的URL地址. 是可选的<br />III.statusCode: 指明错误状态码，表明一种特定的出错状态.<br />IV. redirect:错误重定向的URL.<br />5.&lt;<strong>globalization</strong>&gt;节<br />格式:<br />&lt;globalization <br />requestEncoding=&quot;utf-8&quot; <br />responseEncoding=&quot;utf-8&quot; <br />fileEncoding=&quot;utf-8&quot;<br />/&gt; <br />I.requestEncoding: 它用来检查每一个发来请求的编码. <br />II.responseEncoding: 用于检查发回的响应内容编码.<br />III.fileEncoding: 用于检查aspx,asax等文件解析的默认编码. <br />6.&lt;<strong>sessionState</strong>&gt;节<br />格式:<br />&lt;sessionState <br />mode=&quot;InProc&quot;<br />stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;<br />sqlConnectionString=&quot;data source=127.0.0.1;Trusted_Connection=yes&quot;<br />cookieless=&quot;false&quot; <br />timeout=&quot;20&quot; <br />/&gt;<br />I.mode: 分为off,Inproc,StateServer,SqlServer几种状态<br />mode = InProc 存储在进程中特点：具有最佳的性能，速度最快,但不能跨多台服务器存储共享.mode = &quot;StateServer&quot; 存储在状态服务器中特点:&nbsp;&nbsp; 当需要跨服务器维护用户会话信息时，使用此方法。但是信息存储在状态服务器上，一旦状态服务器出现故障，信息将丢失. mode=&quot;SqlServer&quot; 存储在sql server中特点:工作负载会变大，但信息不会丢失.<br />II. stateConnectionString :指定asp.net应用程序存储远程会话状态的服务器名，默认为本机<br />III.sqlConnectionString:当用会话状态数据库时，在这里设置连接字符串<br />IV. Cookieless:设置为true时，表示不使用cookie会话状态来标识客户；否则，相反.<br />V. TimeOut:用来定义会话状态存储的时间，超过期限，将自动终止会话.<br />7.&lt;<strong>authentication</strong>&gt;节<br />格式:<br />&lt;authentication mode=&quot;Forms&quot;&gt; <br />&lt;forms name=&quot;.ASPXUSERDEMO&quot; loginUrl=&quot;Login.aspx&quot; protection=&quot;All&quot; timeout=&quot;30&quot;/&gt;<br />&lt;/authentication&gt;<br />&lt;authorization&gt;<br />&lt;deny users=&quot;?&quot;/&gt;<br />&lt;/authorization&gt;<br />I.Windows: 使用IIS验证方式<br />II.Forms: 使用基于窗体的验证方式<br />III.Passport: 采用Passport cookie验证模式<br />IV.None: 不采用任何验证方式<br />里面内嵌Forms节点的属性涵义:<br />I.Name: 指定完成身份验证的Http cookie的名称.<br />II.LoginUrl: 如果未通过验证或超时后重定向的页面URL，一般为登录页面，让用户重新登录<br />III.Protection: 指定 cookie数据的保护方式.<br />可设置为: All None Encryption Validation四种保护方式<br />a. All表示加密数据，并进行有效性验证两种方式<br />b. None表示不保护Cookie.<br />c. Encryption表示对Cookie内容进行加密<br />d. validation表示对Cookie内容进行有效性验证<br />IV. TimeOut: 指定Cookie的失效时间. 超时后要重新登录.<br />在运行时对Web.config文件的修改不需要重启服务就可以生效（注：&lt;processModel&gt; 节例外）。当然Web.config文件是可以扩展的。你可以自定义新配置参数并编写配置节处理程序以对它们进行处理。<br />web.config配置文件（默认的配置设置）以下所有的代码都应该位于<br />&lt;configuration&gt;<br />&lt;system.web&gt;<br />和<br />&lt;/system.web&gt;<br />&lt;/configuration&gt;<br />之间，出于学习的目的下面的示例都省略了这段xml标记。<br />1、&lt;<strong>authentication</strong>&gt; 节<br />作用：配置 asp.NET 身份验证支持（为Windows、Forms、PassPort、None四种）。该元素只能在计算机、站点或应用程序级别声明。&lt; authentication&gt; 元素必需与&lt;authorization&gt; 节配合使用。<br />示例：<br />以下示例为基于窗体（Forms）的身份验证配置站点，当没有登陆的用户访问需要身份验证的网页，网页自动跳转到登陆网页。<br />&lt;authentication mode=&quot;Forms&quot; &gt;<br />&lt;forms loginUrl=&quot;logon.aspx&quot; name=&quot;.FormsAuthCookie&quot;/&gt;<br />&lt;/authentication&gt;<br />其中元素loginUrl表示登陆网页的名称，name表示Cookie名称。<br />2、&lt;<strong>authorization</strong>&gt; 节<br />作用：控制对 URL 资源的客户端访问（如允许匿名用户访问）。此元素可以在任何级别（计算机、站点、应用程序、子目录或页）上声明。必需与&lt;authentication&gt; 节配合使用。<br />示例：以下示例禁止匿名用户的访问<br />&lt;authorization&gt;<br />&nbsp;&nbsp; &lt;deny users=&quot;?&quot;/&gt;<br />&lt;/authorization&gt;<br />注：你可以使用user.identity.name来获取已经过验证的当前的用户名；可以使用web.Security.FormsAuthentication.RedirectFromLoginPage方法将已验证的用户重定向到用户刚才请求的页面.具体的<br />3、&lt;<strong>compilation</strong>&gt;节<br />作用：配置 asp.NET 使用的所有编译设置。默认的debug属性为&ldquo;True&rdquo;.在程序编译完成交付使用之后应将其设为False（Web.config文件中有详细说明，此处省略示例）<br />4、&lt;<strong>customErrors</strong>&gt; <br />作用：为 asp.NET 应用程序提供有关自定义错误信息的信息。它不适用于 xml Web services 中发生的错误。<br />示例：当发生错误时，将网页跳转到自定义的错误页面。<br />&lt;customErrors defaultRedirect=&quot;ErrorPage.aspx&quot; mode=&quot;RemoteOnly&quot;&gt;<br />&lt;/customErrors&gt;<br />其中元素defaultRedirect表示自定义的错误网页的名称。mode元素表示：对不在本地 Web 服务器上运行的用户显示自定义(友好的)信息。<br />5、&lt;<strong>httpRuntime</strong>&gt;节<br />作用：配置 asp.NET HTTP 运行库设置。该节可以在计算机、站点、应用程序和子目录级别声明。<br />示例：控制用户上传文件最大为4M，最长时间为60秒，最多请求数为100<br />&lt;httpRuntime maxRequestLength=&quot;4096&quot; executionTimeout=&quot;60&quot; appRequestQueueLimit=&quot;100&quot;/&gt;<br />6、 &lt;<strong>pages</strong>&gt; <br />作用：标识特定于页的配置设置（如是否启用会话状态、视图状态，是否检测用户的输入等）。&lt;pages&gt;可以在计算机、站点、应用程序和子目录级别声明。<br />示例：不检测用户在浏览器输入的内容中是否存在潜在的危险数据（注：该项默认是检测，如果你使用了不检测，一要对用户的输入进行编码或验证)，在从客户端回发页时将检查加密的视图状态，以验证视图状态是否已在客户端被篡改。(注：该项默认是不验证）<br />&lt;pages buffer=&quot;true&quot; enableViewStateMac=&quot;true&quot; validateRequest=&quot;false&quot;/&gt;<br />7、&lt;<strong>sessionState</strong>&gt; <br />作用：为当前应用程序配置会话状态设置（如设置是否启用会话状态，会话状态保存位置）。<br />示例：<br />&lt;sessionState mode=&quot;InProc&quot; cookieless=&quot;true&quot; timeout=&quot;20&quot;/&gt;<br />&lt;/sessionState&gt;<br />注：<br />mode=&quot;InProc&quot;表示：在本地储存会话状态（你也可以选择储存在远程服务器或SAL服务器中或不启用会话状态）<br />cookieless=&quot;true&quot;表示：如果用户浏览器不支持Cookie时启用会话状态(默认为False）<br />timeout=&quot;20&quot;表示：会话可以处于空闲状态的分钟数<br />8、&lt;<strong>trace</strong>&gt; <br />作用：配置 asp.NET 跟踪服务，主要用来程序测试判断哪里出错。<br />示例：以下为Web.config中的默认配置：<br />&lt;trace enabled=&quot;false&quot; requestLimit=&quot;10&quot; pageOutput=&quot;false&quot; traceMode=&quot;SortByTime&quot; localOnly=&quot;true&quot; /&gt;<br />注：<br />enabled=&quot;false&quot;表示不启用跟踪；<br />requestLimit=&quot;10&quot;表示指定在服务器上存储的跟踪请求的数目<br />pageOutput=&quot;false&quot;表示只能通过跟踪实用工具访问跟踪输出；<br />traceMode=&quot;SortByTime&quot;表示以处理跟踪的顺序来显示跟踪信息<br />localOnly=&quot;true&quot; 表示跟踪查看器 (trace.axd) 只用于宿主 Web 服务器</p><p><strong>(三).自定义Web.config文件配置</strong><br />自定义Web.config文件配置节过程分为两步。<br />1.在配置文件顶部 &lt;configSections&gt; 和 &lt;/configSections&gt;标记之间声明配置节的名称和处理该节中配置数据的 .NET Framework 类的名称。<br />2.是在 &lt;configSections&gt; 区域之后为声明的节做实际的配置设置。<br />示例：创建一个节存储数据库连接字符串<br />&lt;configuration&gt;<br />　 &lt;configSections&gt;<br />　 &lt;section name=&quot;appSettings&quot; type=&quot;System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/&gt;<br />&lt;/configSections&gt;<br />　 &lt;appSettings&gt;<br />　　 &lt;add key=&quot;scon&quot; value=&quot;server=a;database=northwind;uid=sa;pwd=123&quot;/&gt;<br />　 &lt;/appSettings&gt;<br />　 &lt;system.web&gt;<br />　　 ......<br />　 &lt;/system.web&gt;<br />&lt;/configuration&gt;<br />访问Web.config文件你可以通过使用ConfigurationSettings.AppSettings 静态字符串集合来访问 Web.config 文件示例：获取上面例子中建立的连接字符串。例如：<br />protected static string Isdebug = ConfigurationSettings.AppSettings[&quot;debug&quot;]<br /><strong>二、web.config中的session配置详解</strong><br />打开某个应用程序的配置文件Web.config后，我们会发现以下这段：<br />&lt; sessionState<br />　　mode=&quot;InProc&quot;<br />　　stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;<br />　　sqlConnectionString=&quot;data source=127.0.0.1;Trusted_Connection=yes&quot;<br />　　cookieless=&quot;false&quot;<br />　　timeout=&quot;20&quot; <br />/&gt; <br />　　这一段就是配置应用程序是如何存储session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的：<br />&lt; sessionState mode=&quot;Off|InProc|StateServer|SQLServer&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookieless=&quot;true|false&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeout=&quot;number of minutes&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stateConnectionString=&quot;tcpip=server:port&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlConnectionString=&quot;sql connection string&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stateNetworkTimeout=&quot;number of seconds&quot;<br />/&gt;<br />必须有的属性是：属性选项描述<br />mode 设置将session信息存储到哪里<br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Off 设置为不使用session功能，<br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InProc 设置为将session存储在进程内，就是asp中的存储方式，这是默认值，<br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StateServer 设置为将session存储在独立的状态服务中，<br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLServer 设置将session存储在sql server中。<br />可选的属性是：属性选项描述<br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookieless 设置客户端的session信息存储到哪里，<br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ture 使用Cookieless模式，<br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false 使用Cookie模式，这是默认值，<br />&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeout 设置经过多少分钟后服务器自动放弃session信息，默认为20分钟。<br />stateConnectionString 设置将session信息存储在状态服务中时使用的服务器名称和端口号，例如：&quot;tcpip=127.0.0.1:42424&rdquo;。当mode的值是StateServer是，这个属性是必需的。<br />sqlConnectionString 设置与sql server连接时的连接字符串。例如&quot;data source= localhost;Integrated Security=SSPI;Initial Catalog=northwind&quot;。当mode的值是 SQLServer时，这个属性是必需的。<br />stateNetworkTimeout 设置当使用StateServer模式存储session状态时，经过多少秒空闲后，断开Web服务器与存储状态信息的服务器的tcp/IP连接的。默认值是10秒钟。<br />asp.NET中客户端session状态的存储<br />　　在我们上面的session模型简介中，大家可以发现session状态应该存储在两个地方，分别是客户端和服务器端。客户端只负责保存相应网站的SessionID，而其他的session信息则保存在服务器端。在asp中，客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie，那末他也就无法享受session的便利之处了，甚至造成不能访问某些网站。为了解决以上问题，在 asp.NET中客户端的session信息存储方式分为：Cookie和Cookieless两种。<br />　　asp.NET中，默认状态下，在客户端还是使用Cookie存储session信息的。如果我们想在客户端使用Cookieless的方式存储session信息的方法如下：<br />　　找到当前Web应用程序的根目录，打开Web.Config文件，找到如下段落：<br />&lt; sessionState<br />　　mode=&quot;InProc&quot;<br />　　stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;<br />　　sqlConnectionString=&quot;data source=127.0.0.1;Trusted_Connection=yes&quot;<br />　　cookieless=&quot;false&quot;<br />　　timeout=&quot;20&quot; <br />/&gt;<br />　　这段话中的cookieless=&quot;false&quot;改为：cookieless=&quot;true&quot;，这样，客户端的session信息就不再使用 Cookie存储了，而是将其通过URL存储。关闭当前的IE，打开一个新IE，重新访问刚才的Web应用程序，就会看到类似下面的样子：<br />其中，http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245) /default.aspx中黑体标出的就是客户端的session ID。注意，这段信息是由IIS自动加上的，不会影响以前正常的连接。<br />asp.NET中服务器端session状态的存储准备工作：<br />　　为了您能更好的体验到实验现象，您可以建立一个叫做SessionState.aspx的页面，然后把以下这些代码添加到&lt; body&gt;&lt; /body&gt;中。<br />&lt; scriptrunat=&quot;server&quot;&gt;<br />Sub Session_Add(sender As Object, e As EventArgs)<br />　 session(&quot;MySession&quot;) = text1.Value<br />　 span1.InnerHtml = &quot;Session data updated! &lt; P&gt;Your session contains: &lt; font color=red&gt;&quot; &amp; session(&quot;MySession&quot;). ToString() &amp; &quot;&lt; /font&gt;&quot;<br />End Sub<br />Sub CheckSession(sender As Object, eAs EventArgs)<br />　 If (Session(&quot;MySession&quot;)Is Nothing) Then<br />　　　 span1.InnerHtml = &quot;NOTHING, session DATA LOST!&quot;<br />　 Else<br />　　　 span1.InnerHtml = &quot;Your session contains: &lt; font color= red&gt;&quot; &amp; session(&quot;MySession&quot;).ToString() &amp; &quot;&lt;&nbsp;&nbsp; /font&gt;&quot;<br />End If<br />End Sub<br />&lt; /script&gt;<br />&lt; formrunat=&quot;server&quot;id=&quot;Form2&quot;&gt;<br />　 &lt; inputid=&quot;text1&quot;type=&quot;text&quot;runat=&quot;server&quot;name=&quot;text1&quot;&gt;<br />　 &lt; inputtype=&quot;submit&quot;runat=&quot;server&quot;OnServerClick=&quot;Session_Add&quot;<br />　　　　　 value=&quot;Add to session State &quot; id=&quot;Submit1&quot;name=&quot;Submit1&quot;&gt;<br />　 &lt; inputtype=&quot;submit&quot;runat=&quot;server&quot;OnServerClick=&quot;CheckSession&quot;<br />　　　　　 value=&quot; View session State &quot; id=&quot;Submit2&quot;name=&quot;Submit2&quot;&gt;<br />&lt; /form&gt;<br />&lt; hrsize=&quot;1&quot;&gt;<br />&lt; fontsize=&quot;6&quot;&gt;&lt; spanid=&quot;span1&quot;runat=&quot;server&quot; /&gt;&lt; /font&gt; <br />　　这个SessionState.aspx的页面可以用来测试在当前的服务器上是否丢失了session信息。<br />将服务器session信息存储在进程中<br />　　让我们来回到Web.config文件的刚才那段段落中：<br />&lt; sessionState<br />　　mode=&quot;InProc&quot;<br />　　stateConnectionString=&quot;tcpip=127.0.0.1:42424&quot;<br />　　sqlConnectionString=&quot;data source=127.0.0.1;Trusted_Connection=yes&quot;<br />　　cookieless=&quot;false&quot;<br />　　timeout=&quot;20&quot; <br />/&gt;<br />　　当mode的值是InProc时，说明服务器正在使用这种模式。<br />　　这种方式和以前asp中的模式一样，就是服务器将session信息存储在IIS进程中。当IIS关闭、重起后，这些信息都会丢失。但是这种模式也有自己最大好处，就是性能最高。应为所有的session信息都存储在了IIS的进程中，所以IIS能够很快的访问到这些信息，这种模式的性能比进程外存储session信息或是在sql server中存储session信息都要快上很多。这种模式也是asp.NET的默认方式。<br />　　好了，现在让我们做个试验。打开刚才的SessionState.aspx页面，随便输入一些字符，使其存储在session中。然后，让我们让IIS重起。注意，并不是使当前的站点停止再开始，而是在IIS中本机的机器名的节点上点击鼠标右键，选择重新启动IIS。(想当初使用NT4时，重新启动IIS必须要重新启动计算机才行，微软真是@#$%^&amp;)返回到SessionState.aspx页面中，检查刚才的session信息，发现信息已经丢失了。<br />将服务器session信息存储在进程外<br />　　首先，让我们来打开管理工具-&gt;服务，找到名为：asp.NET State Service的服务，启动它。实际上，这个服务就是启动一个要保存session信息的进程。启动这个服务后，你可以从Windows任务管理器-&gt;进程中看到一个名为 aspnet_state.exe的进程，这个就是我们保存session信息的进程。<br />　　然后，回到Web.config文件中上述的段落中，将mode的值改为StateServer。保存文件后的重新打开一个IE，打开 SessionState.aspx页面，保存一些信息到session中。这时，让我们重起IIS，再回到SessionState.aspx页面中查看刚才的session信息，发现没有丢失。<br />　　实际上，这种将session信息存储在进程外的方式不光指可以将信息存储在本机的进程外，还可以将session信息存储在其他的服务器的进程中。这时，不光需要将mode的值改为StateServer，还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1，你想把session存储在ip为192.168.0.2的计算机的进程中，就需要设置成这样： stateConnectionString=&quot;tcpip=192.168.0.2:42424&quot;。当然，不要忘记在192.168.0.2的计算机中装上.NET Framework，并且启动asp.NET State Services服务。<br />将服务器session信息存储在sql server中<br />　　首先，还是让我们来做一些准备工作。启动sql server和sql server代理服务。在sql server中执行一个叫做 InstallSqlState.sql的脚本文件。这个脚本文件将在sql server中创建一个用来专门存储session信息的数据库，及一个维护session信息数据库的sql server代理作业。我们可以在以下路径中找到那个文件：<br />[system drive]\winnt\Microsoft.NET\Framework\[version]\ <br />　　然后打开查询分析器，连接到sql server服务器，打开刚才的那个文件并且执行。稍等片刻，数据库及作业就建立好了。这时，你可以打开企业管理器，看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程，没有用户表。实际上session信息是存储在了tempdb 数据库的ASPStateTempSessions表中的，另外一个ASPStateTempApplications表存储了asp中 application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理-&gt;SQL server代理-&gt;作业，发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业，这个作业实际上就是每分钟去ASPStateTempSessions 表中删除过期的session信息的。<br />　　接着，我们返回到Web.config文件，修改mode的值改为SQLServer。注意，还要同时修改sqlConnectionString的值，格式为：<br />sqlConnectionString=&quot;data source=localhost; Integrated Security=SSPI;&quot;<br />　　其中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域的方式来维护两边验证的一致性。<br />　　同样，让我们做个试验。向SessionState.aspx中添加session信息，这时发现session信息已经存在 sql server中了，即使你重起计算机，刚才的session信息也不会丢失。现在，你已经完全看见了session信息到底是什么样子的了，而且又是存储在sql server中的，能干什么就看你的发挥了。<br />&nbsp;<br />总结<br />三、asp.net 关于form认证的一般设置<br />asp.net 关于form认证的一般设置：<br />1: 在web.config中，加入form认证；<br />&nbsp;&nbsp; &lt;authentication mode=&quot;Forms&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forms name=&quot;auth&quot; loginUrl=&quot;index.aspx&quot; timeout=&quot;30&quot;&gt;&lt;/forms&gt;<br />&lt;/authentication&gt;<br />&lt;authorization&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;deny users=&quot;?&quot; /&gt;<br />&nbsp;&lt;/authorization&gt;<br />2: 如果有注册页面时还应该允许匿名用户调用注册页面进行注册;<br />以下代码应该在&lt;configuration&gt;&lt;system.web&gt;之间,而不应该包含到&lt;system.web&gt;..&lt;/system.web&gt;之间;<br />----------------表示允许匿名用户对 userReg.aspx页面进行访问.<br />&nbsp;&lt;location path=&quot;userReg.aspx&quot;&gt;<br />&nbsp;&lt;system.web&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;authorization&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;allow users=&quot;?&quot; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/authorization&gt;<br />&nbsp;&lt;/system.web&gt;<br />&lt;/location&gt;<br />3 在登录成功后要创建身份验证票, 表明已经通过认证的合法用户;<br />if(登陆成功)<br />System.Web.Security.FormsAuthentication.SetAuthCookie(用户名称, false);<br />四、访问Web.config文件<br />　　你可以通过使用ConfigurationSettings.AppSettings 静态字符串集合来访问 Web.config 文件示例：获取上面例子中建立的连接字符串。例如：<br />protected static string Isdebug = ConfigurationSettings.AppSettings[&quot;scon&quot;]</p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/28.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=28</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=28&amp;key=e94cbb6d</trackback:ping></item><item><title>C# 除法使用须知</title><author>30538357@qq.com (dazix)</author><link>http://www.dazix.cn/post/26.html</link><pubDate>Tue, 25 Aug 2009 14:41:39 +0800</pubDate><guid>http://www.dazix.cn/post/26.html</guid><description><![CDATA[<p>问题：<br />using System;<br />namespace ConsoleApplication1<br />...{<br />&nbsp;&nbsp;&nbsp; class Program<br />&nbsp;&nbsp;&nbsp; ...{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(5 / 2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(5.0 / 2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />输出：<br />2<br />2.5</p><p>排疑：</p><p>using System;<br />namespace ConsoleApplication1<br />...{<br />&nbsp;&nbsp;&nbsp; class Program<br />&nbsp;&nbsp;&nbsp; ...{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine((5 / 2).GetType());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine((5.0 / 2).GetType());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine((5 / 2).GetType());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine((5D / 2).GetType());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine((5M / 2).GetType());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine((5F / 2).GetType());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine((5L / 2).GetType());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(((short)5 / 2).GetType());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />输出：<br />System.Int32<br />System.Double<br /><br />System.Int32<br />System.Double<br />System.Decimal<br />System.Single<br />System.Int64<br />System.Int32</p><p>另外在c#中 Convert.ToDouble(str).ToString(); 输出到页面时 将自动去除小数后面无用的0 保留有效的小数 比如1.200000 =》1.2字符串<br />&nbsp;</p>]]></description><category>C#/Asp.net</category><comments>http://www.dazix.cn/post/26.html#comment</comments><wfw:comment>http://www.dazix.cn/</wfw:comment><wfw:commentRss>http://www.dazix.cn/feed.asp?cmt=26</wfw:commentRss><trackback:ping>http://www.dazix.cn/cmd.asp?act=tb&amp;id=26&amp;key=c589aebf</trackback:ping></item></channel></rss>
