(asp.net)关于SessionState与序列化的一点教训

很简单的东西,因为在学习中遇到了,所以记录下来.

事情的起因是,我在做一个购物蓝时,将一个自定义的类CartManager整个放进Session中,它的部分代码如下,其实就是有一个Private的ArrayList成员_cart用来放CartInfo类实例,而CartInfo类又包括一个成员ProductInfo _product和一个double _moneny...并不复杂.但是我都没有弄任何Serializable的东西,于是...

本机调试没问题,放到服务器上却发现这个购物车表现非常怪异,时好时坏,总觉得好象Session里的东西乱得很,有时能存进去有时存不进?

比较了本机与服务器的环境,我知道问题肯定与SessionState有关.因为服务器用了Web Farm(并且将最大工作进程数设置成了10).

一般我们在做一个WEB Application的时候,它的SessionState的Mode=InProc的,可参见web.config文件中的配置

< sessionState
mode ="InProc"
stateConnectionString
="tcpip=127.0.0.1:42424"
sqlConnectionString
="datasource=127.0.0.1;Trusted_Connection=yes"
cookieless
="false"
timeout
="20"
/>

在服务器上,因为存在多个工作进程,所以需要将它的写法改成 mode=StateServer了,否则就会造成前面所说的Session中的值不确定的现象.但是,如果简单地这样改一下,系统又报错说对于以StateServer 或者 SqlServer两种方式保存会话状态,要求对象是可序列化的(大意如此)...所以我们还需要再将对象做一下可序列化声明.

如果要保存的对象很简单,都是由基本类型组成的,就只需要声明一下属性即可,如:

[Serializable()]
public class ProductInfo {

privatestringf_SysID;


publicstringSysID{
get{
returnthis.f_SysID;
}

set{
this.f_SysID=value;
}

}

对于本例中,CartInfo与 ProductInfo两个类,可以这样声明一下.只是CartManager就稍多几句话,如下:

[Serializable]
public class CartManager:ISerializable
{
privateArrayList_cart=newArrayList();

publicCartManager()
{
}


protectedCartManager(SerializationInfoinfo,StreamingContextcontext)
{
this._cart=(ArrayList)info.GetValue("_cart",typeof(ArrayList));
}


voidISerializable.GetObjectData(SerializationInfoinfo,StreamingContextcontext)
{
info.AddValue(
"_cart",this._cart);
}


privateCartInfofindCartInfo(stringsid)
{
foreach(CartInfociinthis._cart)
{
if(ci.Product.SysID.Equals(sid))returnci;
}

returnnull;
}



publicArrayListgetCart()
{
returnthis._cart;
}


这样实现了整个CartManager--CartInfo--ProductInfo的可序列化声明,于是就一切正常了...

另附<SessionState>节点的说明如下;

<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;user id=sa;password="
cookieless="false"
timeout="20"
/>

答:

1、127.0.0.1是本机的默认ip。

2、指定远程存储会话状态的服务器名称和端口。例如“tcpip=127.0.0.1:42424”。当 mode 为 StateServer 时该属性是必需的。

3、这是为StateServer模式管理Session提供服务的,你可以在服务中停止掉asp.net state server服务即不能访问。

4、在Asp.NET里3中存储SessionState的方式,进程内、状态服务器、SQLServer,mode="InProc"表示进程内,可以认为当使用状态服务器时需要stateConnectionString(在服务器上启动状态服务),使用SQLServer时需要sqlConnectionString(需要额外安装一个数据库)。

5、配置会话状态:可以通过 web.config 文件中的 <sessionState> 节配置会话状态功能。若要使默认的超时时间(20 分钟)延长一倍,可以将下列内容添加到应用程序的 web.config 文件:

<sessionState
timeout="40"
/>

默认情况下,ASP.NET 像 ASP 一样,在处理请求的同一进程中存储会话状态。如果 Cookie 不可用,可以通过将会话标识符添加到 URL 来跟踪会话。若要启用此功能,请设置以下内容:

<sessionState
cookieless="true"
/>

默认情况下,ASP.NET 像 ASP 一样,在处理请求的同一进程中存储会话状态。另外,ASP.NET 可以在外部进程中存储会话数据,而外部进程甚至可以驻留在另一台计算机上。若要启用此功能:

使用服务管理单元或者通过在命令行上执行“net start aspnet_state”来启动 ASP.NET 状态服务。默认情况下,状态服务在端口 42424 上侦听。若要更改此端口,请修改服务的注册表项:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSte/Services/aspnet_state/Parameters/Port
将 <sessionState> 节的 mode 属性设置为“StateServer”。
用启动 aspnet_state 的计算机的值配置 stateConnectionString 属性。
/
http://chs.gotdotnet.com/quickstart/aspplus/doc/stateoverview.aspx
6、127.0.0.1是回调ip地址,是它自己的回调地址. 在运行下 ipconfig 127.0.0.1 -t。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值