9、使用Session状态

使用Session状态

不可能真的用Cookie来保存购物车。cookie太小也太简单。
要突破Cookie的限制,Asp.net Framework支持一个名为Session状态的功能。

Session没有大小限制
Session可以保存复杂的对象。

SessionSet.aspx
[code]
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
Session["message"] = "Hello World!";
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>
Session Item Added!</h1>
</div>
</form>
</body>
</html>
[/code]

SessionGet.aspx
[code]
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
lblMessage.Text = Session["message"].ToString();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblMessage" runat="server"></asp:Label>
</div>
</form>
</body>
</html>
[/code]

当使用Session状态时,一个名叫Asp.net_sesionid的Cookie会自动添加到浏览器。
包含了一个唯一标识符,可在页面切换时跟踪用户。

向Session对象增添项目时,这个项目将存储在Web服务器上而不是Web浏览器上。Asp.net_sessionId用于正确地关联数据和用户。

默认情况下,如果Cookie被禁用,Session状态也不能工作。
如果用户超过20分钟不请求任何页面,删除Session状态数据。

2011-5-13 11:27 danny
1、在Session状态中保存数据库数据
可以用Session状态来创建用户相关的缓存。
可为用户载入数据,然后允许用户排序或过滤该数据。

SessionDataView.aspx
[code]
<%@ Page Language="C#" %>

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
DataView dvMovies;
protected void Page_Load(object sender, EventArgs e)
{
dvMovies = (DataView)Session["Movies"];
if (dvMovies == null)
{
string conString = WebConfigurationManager.ConnectionStrings["Movies"].ConnectionString;
SqlDataAdapter dad = new SqlDataAdapter("Select ID,Title,Director from Movies", conString);
DataTable dtblMovies = new DataTable();
dad.Fill(dtblMovies);
dvMovies = new DataView(dtblMovies);
Session["Movies"] = dvMovies;
}
}

protected void grdMovies_Sorting(object sender, GridViewSortEventArgs e)
{
dvMovies.Sort = e.SortExpression;
}

protected void Page_PreRender(object sender, EventArgs e)
{
grdMovies.DataSource = dvMovies;
grdMovies.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="grdMovies" AllowSorting="true" EnableViewState="false" runat="server"
OnSorting="grdMovies_Sorting">
</asp:GridView>
<br />
<asp:LinkButton ID="lnkReload" Text="Reload Page" runat="server" />
</div>
</form>
</body>
</html>
[/code]

同时要新建数据库,Web.config增加ConString
数据库表:Movies
[code]
id title director
int(自增) nvchar(50) nVarchar(50)
[/code]

web.config添加代码:
[code]
<configuration>
<connectionStrings>
<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
<add name="Movies" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\s2_3.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
[/code]

结果:

2011-5-16 15:23 danny

2、使用Session对象
主要API是:HttpSessionState类
HttpSessionState属性:
CookieMode
Count
IsCookieless
IsNewSession
IsReadOnly
Keys
Mode
SessionID
TimeOut
方法:
Abandon
Clear
Remove

3、处理Session事件
Global.asax中包含两个可以处理的关联Session状态的事件:Session Start和Session End事件。
Session Start事件在一个新用户会话开始时被触发。可以利用该事件从数据库载入用户信息。
Session End事件在会话终止时被触发。会话会因用户不活动而过期或者因电焊工地使用Session.Abandon()方法终止。

Glabal.asax
[code]
<%@ Application Language="C#" %>
<script RunAt="server">

void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
Application["SessionCount"] = 0;
}

void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码

}

void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码

}

void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码
Application.Lock();
int count = (int)Application["SessionCount"];
Application["SessionCount"] = count + 1;
Application.UnLock();

}

void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。
// 如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
Application.Lock();
int count = (int)Application["SessionCount"];
Application["SessionCount"] = count - 1;
Application.UnLock();
}

</script>
[/code]

显示SessionCount:ShowSessionCount.aspx
[code]
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
lblSessionCount.Text = Application["SessionCount"].ToString();
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:Label ID="lblSessionCount" runat="server"></asp:Label>

</div>
</form>
</body>
</html>
[/code]

2011-5-16 15:44 danny

4、会话失效控制
默认情况下,如果用户20分钟还不请求页面,Asp.net Framework认为他已经离开应用程序。
可以修改
web.config
[code]
<configuration>
<system.web>
<sessionState timeout="60"/>
</system.web>
</configuration>
[/code]

也可以使用Session.Timeout=60;

5、使用无Cookie的Session状态
SessionID
P113-114

6、配置Session状态存储
默认情况下,Session状态被保存在Asp.net所在的相同的进程。
两个缺点:
1.进程内Session状态很脆弱
2.进程内Session状态可伸缩性较差

Session状态模式为以下值:
Off
InProc
StateServer
SQLServer
Custom
P115-P116

7、配置SQLServer Session状态
如果希望尽可能可靠地保存Session状态,可将Session状态保存到SQL Server数据库。
P117-P118

2011-5-16 16:03 danny
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值