【整理】asp.net2.0网站性能优化解决方案
关于asp.net应用程序性能优化,似乎是一个讨论不完的问题,网上关于这方面的解决方案也比较多,我只简单的提一下,在这里我主要说一下session的三种不同的解决方案。
针对asp.net应用程序性能优化的一般性解决方案大致有以下方式:
(1)避免页面与服务器过多的往返过程,这就要求合理的使用IsPostBack以及服务器控件。
(2)避免过多的服务器控件ViewState,可分别针对控件级、页面级和应用程序级来关闭和开启。
(3)在未使用会话时关闭会话状态
a 并不是所有的页面和应用程序都要使用会话状态,你可以在不使用会话状态的页面将其关闭
b 如果页面只访问会话,但不打算修改它们,可以将其设置为只读
(4)数据访问
a 使用存储过程用于数据访问
b 使用SqlDataReader获得快进的只读数据流
(5)有选择性的缓存那些不易变化数据和页输出
a 不要缓存的太多
b 缓存的时间不要太短
(6)大型Web应用程序,可以先预编译它
(7)在网站发布时禁用调试模式
(8)尽可能避免使用try catch语句来作为判断逻辑
(9)大量字符串连接请使用StringBuilder,不要使用+
以上方式主要是我采取的优化方式,所以先写出来,肯定不全,网上有很多,又需要的可以自行去谷歌或百度搜索,在这里我就不在赘述了。好了言归正传,接下来就到了本篇文章核心部分了,且听我慢慢道来。
asp.net为我们提供了三种(我所知道的)保存会话的方式,具体如下:
第一种,保存在内存中,也叫做进程内会话状态,这也是速度最快的解决方案,主要用于存放少量易失数据。这种也是我们最常用的一种方式,默认就是使用的这种方式。在Web.config中的配置 <sessionState mode="InProc"/>。
第二种,window服务的进程外会话状态,首先要开通操作系统的"Asp.Net状态服务",开通方法如下:"开始">>"所有程序">>"管理工具">>"服务">>"Asp.Net状态服务">>"启用",此服务默认端口为42424。在Web.config中的配置:<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424"/>,示例代码如下:
web.config中
前端代码
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.Session.Add("name", "zhangsan");
this.Session.Add("sex", "nan");
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(string.Format("姓名:{0},性别:{1}",Session["name"].ToString(),Session["sex"].ToString()));
}
}
第三种,SQL数据库的进程外会话状态,这主要用于跨多个处理器或多个计算机缩放应用程序、Web花园和Web农场以及当服务器进程重新启动时不能丢失数据的情况。此方式首先要在数据库创建一个名为ASPState的数据库,创建方式如下:
在Visual Studio命令提示符下输入aspnet_regsql.exe -S [servername] -U [username] -P [password] -ssadd -sstype p。
在Web.config中的配置
<sessionState mode="SQLServer" allowCustomSqlDatabase="false" sqlConnectionString="data source=[servername];uid=[username];pwd=[password]"/>,
其中红色字体表示是否允许使用自定义数据库来保存会话,这里为false表示不允许。示例代码如下
web.config中
前端调用
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.Session.Add("name", "zhangsan");
this.Session.Add("sex", "nan");
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(string.Format("姓名:{0},性别:{1}",Session["name"].ToString(),Session["sex"].ToString()));
}
}
数据库表中数据
以上内容有不全面之处,其中的Custom模式的会话状态,我不经常用,如果想了解下,可查阅MSDN获得帮助。