- 加重服务器负担,影响WEB站的可升级性
- 不能在Web farm场景中有效的使用
- 在WEB服务器的内存中(在处理过程中)
- 在专用的保存sesseion变量的机器中(状态服务器)
- 在SQL 服务器的数据库中
- 可拓展性:如果你正在找一个高度可升级的选择来保存你的session变量的话,SQL服务器是一个选择。它比其它的选择更具有拓展升级的性能。Web farm 架构能够非常容易的访问session 变量因为它们存储在一个独立的数据库中。
- 稳定性: 因为数据在数据库中是物理的持续的,这比其它任何一种都要稳定。即使服务器重启了,数据都还完好。
- 安全性:SQL Server 比任何的内存中保存session或者专用的状态服务器选择都要来得安全。你可以很容易的通过配置SQL 服务器的安全设置来保护你的数据安全。
- 临时存储: 在这种情况下, session 状态被存储在一个"临时数据库"的SQL 服务器的数据库中. 这个工具创建了一个叫ASPState的数据库, 还添加了一些管理session的存储过程在里面. 这个工具还创建必需的表在”临时”数据库. 如果你重启了SQL 服务器,这些session数据将被删除.
- 持久存储: 这个工具创建了一个叫ASPState 的数据库, 还还添加了一些管理session的存储过程在里面. Session 状态被储存在ASPState的数据库中.
- 定制存储: session 和存储过程都被存储在一个定制的数据库中. 这个数据库的名字必须在配置文件中被指定.
Command line switch
|
Description
|
-S <server>
|
指定你想要用于存储
session
状态的数据库的
IP
地址或者名字
|
-U
|
指定被用来连接数据库的用户
ID
|
-P
|
指定被用来连接数据库的密码
|
-E
|
指出你想要连接的服务器需要完整的安全策略
|
-ssadd
|
添加支持服务器模式的
session
状态
|
-ssremove
|
移除支持服务器模式的
session
状态
|
-sstype
|
Session
状态支持的类型
,
一下是可以支持的类型
:
t
代表临时存储
p 代表持久存储 c 代表定制储存 |
-d <database>
|
用于使用的数据库的名字
—
如果要转换
-
sstype,
就用命令
”c”
|
配置你的网站来存储Session 状态
一旦你配置你的SQL服务器来支持session状态存储,下一步就是配置你的网站了。web.config 的标记<sessionState>允许你指定session存储的信息。下列的表中列出了一些这个标记得重要属性:
属性 | 描述 |
mode | Mode属性可以使用一下的几个值: Off:指示这个session状态关闭. |
sqlConnectionString | 如果模式被设置为SQL服务器,你必须指定这个属性。这个属性指定了那个SQL服务器数据库的连接字符串。这个数据库的是用来进行状态的存储的。注意,如果你使用了临时的或者持久的存储选项时候,你不需要在连接字符串中指定数据库的名称(见上)
|
allowCustomSqlDatabase | 如果你想去存储session状态在一个你自己的SQL服务器的数据库中的时候,你必须设置这个属性为“TRUE”。一旦这个属性被设置为true,你要在上面说描述的连接字符串中指定数据库的名称。 |
例子
你可以开发一个简单的网站,设置它来存储一个sesseion状态在一个SQL服务器的数据库中,来示例你到目前为止以上所学的。
设置SQL服务器
打开Visual Studio.NET 2005命令提示器,使用一下命令
aspnet_regsql -ssadd -S .sqlexpress -E -sstype p
aspnet_regsql -ssadd -S .sqlexpress -E -sstype p
这里,你正在使用SQL Express 作为带着完整安全的数据库
Figure 3 展示了一个把带着session 状态类型的工具设置为"persistent"的例子。
Click here for a larger image.
Figure 3: 运行ASPNET_REGSQL.EXE工具
创建和配置一个网站
现在,创建一个新的网站,修改web.config文件成下列的代码
<sessionState
mode="SQLServer"
sqlConnectionString="data source=.sqlexpress;
integrated security=true">
</sessionState>
这里,你添加了这个<sessionState>标记,设置它的模式属性为SQLServer。你还要指定sqlConnectionString属性,把它指向你的SQL SERVER。
创建测试网站的WEB窗体
在WEB站点中添加两个WEB窗体。这两个窗体分别叫page1.aspx和page2.aspx。第一个WEB窗体将显示一个产品列表来选择。被选择的产品被保存在一个DataSet中。然后通过保存这个DataSet 在一个session变量中来把它在请求中传递。第二个Web窗体简单的显示了来自DataSet中的被选择的产品。
通过一下的步骤来完成第一个Web 窗体:
- 拖拉一个GRIDVIEW控件和一个SQL Data Source控件在WEB FORM上.
- 配置SQL Data Source, 从Northwind 数据库的Products 表中选择ProductID, ProductName, 与 UnitPrice columns
- 通过设置他的DataSourceID属性到SQL Data Source控件的ID属性上来绑定GridView到SQL Data Source上.
- 在GridView的samrt标记上, 点击"Allow Selection" checkbox.
- 添加一个HyperLink 控件,设置NavigateUrl属性到Page2.aspx.
下列的标记是由上面的操作生成的(出去不必要的代码)
...
<asp:GridView ID="GridView1" runat="server"
AllowPaging="True" AutoGenerateColumns="False"
CellPadding="4" DataSourceID="SqlDataSource1"
ForeColor="#333333" GridLines="None"
Width="100%"
OnSelectedIndexChanged="GridView1_SelectedIndexChanged"
PageSize="5">
<FooterStyle BackColor="#990000" Font-Bold="True"
ForeColor="White" />
<Columns>
<asp:BoundField DataField="ProductName"
HeaderText="ProductName"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice"
HeaderText="UnitPrice"
SortExpression="UnitPrice" />
<asp:CommandField SelectText="Add to cart"
ShowSelectButton="True" />
</Columns>
</asp:GridView>
...
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl="~/Page2.aspx" Font-Bold="True"
Font-Size="Large">Show my cart</asp:HyperLink>
...
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString=
"<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [ProductName],
[UnitPrice] FROM [Products]
ORDER BY [ProductName]"></asp:SqlDataSource>
Now, add the following code to the SelectedIndexChanged event of the GridView:
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
DataSet ds=null;
if (Session["myds"] == null)
{
ds = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ProductName"));
dt.Columns.Add(new DataColumn("Qty", typeof(System.Int32)));
ds.Tables.Add(dt);
Session["myds"] = ds;
}
else
{
ds = (DataSet)Session["myds"];
}
DataRow row=ds.Tables[0].NewRow();
row["productname"]=GridView1.Rows[GridView1.SelectedIndex].
Cells[0].Text;
row["Qty"]=1;
ds.Tables[0].Rows.Add(row);
}
这里,你可以创建一个 DataSet 和 DataTable. FataTable 包含两个DataColumns: ProducyName 和 Qty. 然后你存储一个session变量"myds".当用户选择一个产品的时候, 你可以创建一个新的DataRow, 分配产品的资料给它, 添加这个ROW去DataTable. 用户的选择可以在跨多个请求中持续.
按一下的步骤创建第二张的Web form
- 拖拉一个GridView到Web form上.
- 添加两个绑定区域
- 设置第一个绑定区域的HeaderText属性成"Product Name". 同样的,设置DataField成"Product Name".
- 设置第二个绑定区域的HeaderText属性成"Quantity". 同样的,设置DataField成" Qty ".
下列的标记是由上面的操作生成的(除去不必要的代码)
...
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False" CellPadding="4"
ForeColor="#333333" GridLines="None" Width="100%">
<FooterStyle BackColor="#1C5E55" Font-Bold="True"
ForeColor="White" />
<Columns>
<asp:BoundField DataField="productname"
HeaderText="Product Name" />
<asp:BoundField DataField="qty"
HeaderText="Quantity" />
</Columns>
</asp:GridView>
...
添加下列的代码到第二张Web Form 的 Page_Load event handler上
protected void Page_Load(object sender, EventArgs e)
{
GridView1.DataSource=(DataSet)Session["myds"];
GridView1.DataBind();
}
这里,你设置GridView控件的DataSource属性到你的储存在session上的DATASET.
然后你通过调用DataBind() 方法来绑定GridView.
运行WEB FORMS 的例子
为了测试你的WEB FORMS, 设置Page.aspx 作为你的起始页, 然后运行你的WEB SITE. 你应该看到如图4所展示的:
Figure 4: 运行Page1.aspx 的例子
通过”Add to cart”按钮选择一些产品. 这将会添加一些行在DataTable上. 记得你正在存储你的DataSet在一个session变量之中. 然后,通过点击”Show my cart” 超链接导航到 Page.aspx . 图5显示了带着前面所选的产品的Page.aspx.
Figure 5: Sample run of Page2.aspx
正如你所见的, Page2.aspx 正确的显示了你在前页所选的那些条目. 这显示了你的session 变量被真正的存储在了SQL服务器的数据库中,并被在第二页中找回. 还有, 注意你在无关储存模式的session中用了相同的存储调用值得标记.
储存Session状态在SQL服务器中的劣势
虽然存储session状态在SQL 服务器中可以使你的网站更容易拓展和更稳定. 但是这个技术有一下的几个劣势
- 执行上: 在执行的几个项目中,一个基于SQL SERVER的session 存储可能是一个最慢地选择. 因为你的session变量是存储在物理的数据库中.它用了更多的时候去存储和读取数据库. 这会影响了你的网站的运行速度.
- 花费: 因为你存储你的数据在数据库中, 你需要一个SQL数据库的执照, 这将给你的网站带来额外的开销.
- 连续的数据: 这个方法要求你所有保存在session变量中的数据必须是连续的. 如果你想存储数据在一个session中,这也许强制你去标记你自己的类作为[Serializable].
总结
rage options.
ASP.NET 2.0 可以允许你存储session状态到一个SQL服务器的数据库. ASPNET_REGSQL.EXE工具配置了数据库来支持这个特性. 更进一步, <sessionState>标记配置你的网站来支持这个模式. 存储一个session状态在一个SQL服务器中是一种更具拓展,安全性和稳定性的选择. 然后, 这种选择的运行相对于其他选择而言将会更慢.
下载代码,
You can download the code that accompanies the article here.