c# Session 的StateServer模式代替InProc模式

转载地址:https://blog.csdn.net/hezudao25/article/details/7953577

开发asp.net应用时,修改web.config中的SessionState节点。
使用

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="120"/> 

 

 


代替

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

 


InProc模式
优点:获取session状态的速度快,session状态直接存储在iis的进程中。
缺点:易丢失,经常需要重新登录

StateServer模式
优点:session状态单独存储在一个进程中,不会因为iis或者应用的重启而丢失状态
缺点:获取session状态的速度比InProc慢一些,毕竟是两个不同的进程。

MSDN解释:

StateServer 模式,此模式将会话状态存储在一个名为 ASP.NET 状态服务的单独进程中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器 .

根据这个解释,即表示stateserver是支持远程存储的,那我们继续看msdn的案例: 

StateServer 模式的一种配置设置,其中会话状态存储在一个名为 SampleStateServer 的远程计算机上:

这个案例本身是没有问题的,但是我们在是实际的项目中往往会出现一些错误,其中一个很重要的原因在于,webconfig这样配置后,要是这段配置生效,那么我们还要确认两台电脑的AllowRemoteConnection是开启的。

<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=SampleStateServer:42424"
      cookieless="false"
      timeout="20"/>
  </system.web>
</configuration>


在开发的时候,对应用有一点修改,就会导致应用的重启,这时候如果使用InProc模式
,那么每次都需要重新登录,比较浪费时间.建议使用StateServer模式。并在iis里面设置超时时间长一些。

注:使用StateServer模式的时候
1、要开启“ASP.NET State Service”服务(设为“自动”)

2、如果stateConnectionString的值不是127.0.0.1或者localhost等代表本地地址的值,需要修改注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state \Parameters 节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许远程电脑的连接,0 代表禁止)→ 设置 Port (端口号)

3、session中存储非序列化的对象,如果违反会抛出  无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。这样的异常。如果向session存储自定义的对象,那么该对象的类上一定要加上[Serializable]注释。

展开阅读全文

当从InProc修改为为StateServer 模式时出错

08-01

web.config 部分配置如下rnrnrn错误提示rn“/”应用程序中的服务器错误。rn--------------------------------------------------------------------------------rnrn无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。 rn说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 rnrn异常详细信息: System.Web.HttpException: 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。rnrn源错误: rnrn执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 rnrn堆栈跟踪: rnrnrn[SerializationException: 程序集 System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 中的类型 System.Data.SqlClient.SqlConnection 未标记为可序列化。]rn System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type, Boolean excludeNonSerializable) +853rn System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +300rn System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +103rn System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter) +493rn System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter) +48rn System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +683rn System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +136rn System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1621rnrn[HttpException (0x80004005): 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。]rn System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1711rn System.Web.SessionState.SessionDictionary.Serialize(BinaryWriter writer) +150rn System.Web.SessionState.StateClientManager.Serialize(SessionStateItem item, Stream stream) +146rn System.Web.SessionState.OutOfProcStateClientManager.System.Web.SessionState.IStateClientManager.Set(String id, SessionStateItem item, Boolean inStorage) +121rn System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +465rn System.Web.SyncEventExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute() +60rn System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +87rnrn rn 论坛

Open session In view模式

04-20

Hibernate+struts2开发的项目。rn解决事务边界和延迟加载的问题,采用了Open Session In view模式。rnrn过滤器的代码如下:rnrn[code=java]rnimport java.io.IOException;rnrnimport javax.servlet.Filter;rnimport javax.servlet.FilterChain;rnimport javax.servlet.FilterConfig;rnimport javax.servlet.ServletException;rnimport javax.servlet.ServletRequest;rnimport javax.servlet.ServletResponse;rnrnimport org.hibernate.Session;rnimport org.hibernate.Transaction;rnrnpublic class SessionFilter implements Filter rnrn public void destroy() rn // TODO Auto-generated method stubrnrn rnrn public void doFilter(ServletRequest request, ServletResponse response,rn FilterChain chain) throws IOException, ServletException rn // TODO Auto-generated method stubrn Session session = null;rn Transaction transaction = null;rn try rn rn session = HibernateUtil.getThreadLocalSession();rn transaction = session.beginTransaction();rn chain.doFilter(request, response);rn transaction.commit();rn rn rn catch (Exception e) rn // TODO: handle exceptionrn if(transaction != null)rn transaction.rollback();rn throw new RuntimeException(e.getMessage(), e);rn rn finallyrn HibernateUtil.colseSession();rn rnrn rnrn public void init(FilterConfig filterConfig) throws ServletException rn // TODO Auto-generated method stubrnrn rnrn[/code]rnrn当我在项目中使用rnSession session = HibernateUtil.getThreadLocalSession();rnsession.save(entity);rn此时显示了插入的select语句,但数据库木有同步,我也知道这是事务没有提交造成的。也就是这个过滤器有问题,当我不解这个过滤器问题出在哪儿。求高人指点。 论坛

没有更多推荐了,返回首页