会话易丢失,解决办法

一.

了解下Web园

一个应用程序池默认是开启一个工作进程,但也可以开启多个工作进程,这样可提高性能,这个功能名为Web园,是小型的“Web农场”,您无需使用多台计算机来传送相同内容(Web农场),而是可以使用一台计算机中的多个进程来传送相同内容。
配置Web园:

IIS->应用程序池->选中使用的应用程序池->右键属性->性能->Web园->最大工作进程数

设置最大进程数大于1,如果这个值大于1,每个请求将启动一个新的工作进程实例,可启动的最多进程数位您所设置的进程数,最大可设置为4000000.后续请求将以循环的方式发送至工作进程。但使用Web园要考虑以下两点:

  1. )每一个工作进程都会消耗系统资源和CPU占用率,太多的工作进程不仅会导致系统资源和CPU利用率急剧消耗,还会造成资源竞争;
  2. )每一个工作进程都具有自己的状态数据,由于请求以循环的方式路由到应用程序池工作进程,这就造成数据不一致,比如session丢失等;

还有些朋友发现有多个w3wp进程,很不理解,有些朋友甚至认为是病毒。其实这完全和Web园的设置有关,一个工作进程就是一个w3wp.

二.

ASP.NET提供了5种会话状态选项:

InProc

StateServer

SQLServer

Custom

Off

1. InProc

InProc选项支持在进程内保存会话状态,实际上是在w3wp.exe工作进程中保存会话状态。这意味着保存会话状态数据将分别保存在每台服务器中,因此其他服务器无法访问当前服务器会话状态数据。这还意味着一个应用程序池回收操作将导致会话状态的丢失。在不考虑Off选项的情况下,这种解决方案运行速度最快,但是,除非我们应用粘性会话机制,否则这种解决方案无法在Web farm环境中正常工作。如果使用了粘性会话机制、同时没有使用Web garden的话,那么InProc是一个可行的解决方案。

如果需要在web.config文件或者其他配置文件中设置会话状态,可以在配置文件的<system.web>配置节中添加一个sessionState标记,如下面的代码所示。

<configuration>

<system.web>

<sessionState mode="InProc" />

</system.web>

</configuration>

2. StateServer

StateServer是微软公司提供的另一种解决方案,但是这种解决方式没有提供故障转移的功能。当在服务器中成功地安装了ASP.NET之后,Windows Services将增加一项名为ASP.NET State Service的服务,默认情况下,这个服务处于禁用状态,但是可以随时启用这项服务。我们需要将该服务的启动模式设置为Automatic,这样每次系统重启时,这项服务都会自动启动。

设置步骤: Run->services.msc->ASP.NET 状态服务(启用,并,设置自动)(找到服务,按名称排序)

默认情况下,ASP.NET SessionState服务是无法远程访问的,如果需要远程运行ASP.NET SessionState服务,那么需要在注册表中将HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection的值设为1。

<sessionState mode="StateServer" />

如果不打算在本地服务器中使用默认的状态服务器,那么可以根据需要设置参数。<sessionState mode="StateServer" stateConnectionString="

tcpip=10.0.0.10:42424" />

本地服务器有时会出现:

HTTP 错误 500.0 - Internal Server Error

调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:\PHP\php5isapi.dll" 上

此时在该文件夹加入匿名用户的只读访问权限

3. SQLServer

微软提供的第三个解决方案是SQLServer会话状态。如果当前应用程序运行环境中使用了一个SQLServer群集,那么这种解决方案是一种非常合适的解决方案。与其他方案相比,SQLServer会话状态的性能开销最高,但是因为SQLServer会话状态提供了冗余支持,所以这种方案对性能的影响也是微不足道的。在部署这种解决方案之前,请务必确保系统性能能够满足当前应用程序的要求,同时,还要保证系统具有良好的可伸缩性。

SQL Server会话状态的配置较为复杂,需要使用aspnet_regsql.exe工具

4. Custom

ASP.NET支持实现自定义的会话状态提供程序。所以,可以实现一种不同于微软解决方案的方案。与其他选项类似,一旦成功地开发了自定义的解决方案并将其安装部署到服务器中之后,那么,我们必须对网站的web.config文件以及应用程序根目录下的web.config文件进行更新,使之指向自定义的提供程序。

5. Off

可以完全关闭会话状态,在某些情况下这样做是有意义的,因为启用会话状态后,即使我们没有使用会话状态,系统性能也会有所下降。为了关闭会话状态,我们可以按照"InProc"一节的内容进行操作,唯一不同之处是选择Off而不是选择In Process。在IIS Manager中,这种做法被称为Not enabled。

三、

第三方会话状态解决方案

ScaleOut Software(www.scaleoutsoftware.com)和Alachisoft(www.alachisoft.com)是两家著名的第三方软件厂商,致力于提供Web farm会话状态解决方案。这两家第三方软件厂商的产品均可以应用于高可用、高可伸缩性的Web farm系统,并且可以在进程内保存会话状态数据,同时支持立即复制所有的修改;此外,产品还支持在进程外保存会话数据,为了在进程外保存会话数据,需要使用运行在所有服务器中的自定义工作进程。

ASP.NET应用中会话状态丢失及解决策略的更多相关文章

  1. iis7中session丢失的解决方法小结

    这篇文章主要介绍了在windows server 2008系统中,session丢失的解决方法,供大家学习参考 问题描述: Windows Server 2008 +IIS +ASP.net +SQL ...

  2. IFrame中Session丢失的解决办法

    1.打开IIS管理器 inetmgr2.选择被嵌入iframe源站点或者目录,右键点击打开属性框3.切换到HTTP头4.添加5.自定义HTTP头名: P3P6.自定义HTTP头值: CP=" ...

  3. [译]ASP.NET Core中使用MediatR实现命令和中介者模式

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何 ...

  4. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  5. Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)

    1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...

  6. 为什么我的会话状态在ASP.NET Core中不工作了?

    原文:Why isn't my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookie ...

  7. asp.net MVC中使用Html.Checkbox提示该字符串未被识别为有效的布尔值错误的解决方法

    在asp.net MVC中使用Html.CheckBox提交后出现该字符串未被识别为有效的布尔值错误,或从类型“System.String”到类型“System.Boolean”的参数转换失败. 错误 ...

  8. 在IE浏览器中iframe跨域访问cookie/session丢失的解决办法

    单点登录需要在需要进入的子系统B中添加一个类,用于接收A系统传过来的参数: @Action(value = "outerLogin", results = { @Result(na ...

  9. ASP.NET MVC中对Model进行分步验证的解决方法

    原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个 ...

随机推荐

  1. 说说无耻的商河水木清华开发商2013"交房

    说说无耻的水木清华开发商2013"交房" 我买的是22号楼,合同里写的是2011年6月30号前交房.4月28我手机响了,电话那边说是水木清华的,29号交房.说交房通知书已经EMS发 ...

  2. Salesforce 使用Js 调用Webservice实例

    1,创建 Custom Button 在页面上 2, 创建CustomJs 代码调用Webservice <!--参数名区分大小写,对于跨层object直接在Object名后直接加参字段名即可- ...

  3. C#如何分割多个空格分隔的字符串?

    using System; using System.Text; using System.Text.RegularExpressions; namespace test { class Progra ...

  4. 关于Delphi中多线程传递参数的简单问题

    http://bbs.csdn.net/topics/390513469/ unit uThread; interface uses Classes; type Th = class(TThread) ...

  5. cs11_c++_lab4a

    SparseVector.hh class SparseVector { private: //结构体不一定会用到,不用初始化 struct node { int index; int value; ...

  6. swift 动画合集

    本例参照objective-c的动画合集进行swift的转换,objective-c地址参照地址https://github.com/yixiangboy/IOSAnimationDemo 1.基础动 ...

  7. c#的dllimport使用方法详解,调试找不到dll的方法

    DllImport会按照顺序自动去寻找的地方: 1.exe所在目录 2.System32目录 3.环境变量目录所以只需要你把引用的DLL 拷贝到这三个目录下 就可以不用写路径了 或者可以这样serve ...

  8. 安装Nexus

  9. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...

  10. 关于Onvif的event

    昨天又仔细研究了一下camera的alarm功能,发现原来很简单,首先订阅一下,即create,拿到订阅号后直接pull,一旦收到信息就再次用订阅号pull.参考http://www.doc88.co ...