Asp.Net StateServer实现共同域名下Session共享
概述
在实验的时候,参照了多方的信息,确实成功了,这里简单记录一下。
我们知道,在Asp.Net的Web.Config文件中,System.Web节点下,有个sessionState节点,它说明了应用程序的Session处理方式,它有如下几个选项:

MSDN对其分别作简单的解释:
(MSDN地址:https://msdn.microsoft.com/zh-cn/library/h6bb9cz9(VS.80).aspx)
|
值 |
说明 |
|
Custom |
会话状态将使用自定义数据存储区来存储会话状态信息。 |
|
InProc |
会话处于正在处理 ASP.NET 辅助进程的状态。这个辅助进程是:aspnet_state. |
|
Off |
会话状态被禁用。 |
|
SQLServer |
会话状态将使用进程外 SQL Server 数据库来存储状态信息。 |
|
StateServer |
会话状态将使用进程外 ASP.NET 状态服务来存储状态信息。 |
我们今天要说的是StateSerrer方式,我们采取远程服务器的aspnet_state进程来集中管理多台服务器的Session。
概述
路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters

将AllowRemoteConnection的值设置为1.
注意:配置完成后要在服务管理器中重启aspnet_state这个服务.
第二步:配置的Web.config来指定Session服务器地址和连接参数
1.配置应用服务器Web.Config下system.web下的SessionState节点
<sessionState cookieless="UseCookies" mode="StateServer" stateConnectionString="tcpip=192.168.5.2:42424" timeout="20"/>
其中:mode一定是StateServer
StateConnectionString是tcpip=Session服务器IP:端口的格式,tcpip指应用服务器与Session服务器交流Session数据时采用的传输方式,Session服务器就不说了,端口默认是42424.
2.配置应用服务器下system.web下的machineKey 节点
<machineKey validationKey="7285450293EE699F349F7DB9BEA1F0B9EE1F045F" decryptionKey="73035EE41002AFB88D12A1B08559389CA351359A232649B3" validation="SHA1" />
这个machineKey的值可以是随意的,但应用服务器和Sessione服务器一定要配成一样的,因为需要用它来给session进行解密。
情况1:设置Session的域----同域名(www.a.com)访问
因为stateserver会把这些要共享session放置到 appdomin的情况来区分,而appdomain是根据网站的标识ID来区分的,因此我们只需要共享Session的应用服务器的域设置成一样即可。当共享Session的应用均是www.a.com时,我们可以在自定义IHttpModule中,在request结束的事件中,改写ASP.NET_SessionId的cookie的 domain为这些网站的主域名即可。如下所示(转自:http://sai5d.blog.163.com/):
public class ShareSessionModule : IHttpModule
{
#region IHttpModule 成员 void IHttpModule.Init(HttpApplication context)
{
context.EndRequest += new EventHandler(this.EndRequest);
} private void EndRequest(object sender, EventArgs args)
{
HttpApplication application = sender as HttpApplication;
for (int i = 0; i < application.Response.Cookies.Count; i++)
{
if (application.Response.Cookies[i].Name == "ASP.NET_SessionId")
application.Response.Cookies[i].Domain = ".test.com";
}
} #endregion
}
情况2:设置Session的域----跨域名(www.a.com和www.b.com)访问概述
共享的网站是跨域名了,如www.a.com和www.b.com ,按照情况1的思路,现在Session在服务器是存在两个appdomain中了,这样我们就不能共享Session了。但,我们可以通过反射修改 OutOfProcSessionStateStore类中静态成员s_uribase来实现我们的目的,它是state外部存储需要访问的appdomain的一个内部id(其实就是多个appdomain映射为一个内部id,这个id就是s_uribase)。只要在创建session前,设置一个相同的appdomain的id,这样就能确保取session和放置session都到同一个 appdomain中,这个id可以随意设置。如下所示(转自:http://sai5d.blog.163.com/):
public class ShareSessionModule : IHttpModule
{ #region IHttpModule 成¨¦员 void IHttpModule.Dispose()
{
//throw new Exception("The method or operation is not implemented.");
} void IHttpModule.Init(HttpApplication context)
{
//throw new Exception("The method or operation is not implemented.");
Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore");
FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic); if (uriField == null)
throw new ArgumentException("UriField was not found"); uriField.SetValue(null, ".test.com");
context.EndRequest += new EventHandler(this.EndRequest); } private void EndRequest(object sender, EventArgs args)
{
HttpApplication application = sender as HttpApplication; for (int i = ; i < application.Response.Cookies.Count; i++)
{ application.Response.Cookies[i].Domain = ".test.com";
}
} #endregion
}
第三步:将自定义HttpModule加入Web.config
<httpModules>
<add name="CookieTest" type="WebApplication1. ShareSessionModule,WebApplication1"/>
</httpModules>
参考文档
http://sai5d.blog.163.com/blog/static/62225483201010211393132/
https://msdn.microsoft.com/zh-cn/library/h6bb9cz9(VS.80).aspx
Asp.Net StateServer实现共同域名下Session共享的更多相关文章
- IIS下Asp.Net应用程序多进程设置及Session共享
背景: 目前项目中在单个进程的应用程序经常会遇到w3c.exe崩溃的情况,于是就设想是否可以通过IIS多进程的方案来避免出现该问题. 于是搜了下“怎么实现多进程的方案”,找到了这篇文章:http:// ...
- Session跨域、Session共享、Mode=StateSever方式解决问题
前言 很多童鞋在工作或面试的过程中,也许会遇到这样的问题,使用Session,怎样让多个站点实现Session共享的问题,也就是在A站点登录,那么在B站点就不需要重新登录了那?如果采用Session保 ...
- asp.net 子应用程序/虚拟目录 session共享
最近遇到了一个问题,我做的asp.net mvc应用程序要作为一个子应用程序部署到几个站点中,需要在本应用程序中获取站点的session值. 已经使用了session state server,并设置 ...
- Session共享的解决方案
http://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html Session共享的解决方案 1.客户端SessionID值唯一: ...
- ASP.NET 使用mode=”InProc”方式保存Session老是丢失,无奈改成StateServer 模式。
http://blog.csdn.net/fox123871/article/details/8165431 session是工作在你的应用程序进程中的.asp.net进程.iis往往会在20分钟之后 ...
- ASP.NET 负载均衡 StateServer Session共享问题(经验记录)
(源地址:http://www.cnblogs.com/ryhan/p/3748976.html) 最近在改造公司的一个系统 支持F5硬件负载,由于系统后面还跟了个异步工具,需要将Admin上传的文件 ...
- memcache相同主域名下的session共享
本配置适合具有相同主域名的多台服务器进行session共享. 例如:www.lee.com , bbs.lee.com(多个子域名). 配置session保存在memcache: ini_set(&q ...
- Session 共享(StateServer模式)(原创)
Session 共享要注意两点: 1.必须在同一个域名下 2.StateServer模式是把session保存在同一台服务器上的进程:aspnet_state.exe里面,当然也可以保存在memcac ...
- Windows 环境下分布式跨域Session共享(转)
出处:http://www.cnblogs.com/stangray/p/3328092.html 为什么还是那句话,在网上找了N篇Session共享,但真正可以直接解决问题的还是没有找到. 一.以下 ...
随机推荐
- 网络基础 HTTP协议之缓存简介
HTTP协议之缓存简介 by:授客 QQ:1033553122 用浏览器查看缓存 IE为例,Tools->Internet options -> View files,如图 点击图示的Vi ...
- MySql 定时任务的使用
MySql 定时任务的使用 by:授客 QQ:1033553122 简介 自 MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定 ...
- react native中的聊天气泡以及timer封装成的发送验证码倒计时
今天看来情书写的文章,研究了一下大佬写的文章,自己做一点总结. 其实,今天我想把我近期遇到的坑都总结一下:1.goBack的跨页面跳转,又两种方法,一可以像兔哥那样修改navigation源码,二可以 ...
- NETBEAN 启动报错 CANNOT LOCATE JAVA INSTALLATION IN SPECIFIED JDKHOME的解决办法
打开 NetBeans 安装目录下的\etc目录,查找报错信息中的jdk字符串,修改netbeans.conf文件即可
- ionic默认样式android和ios差异
ionicframework中android和ios在默认样式上有一些不同的地方,官方文档中都有说明,但是经常会想不起. 一.差异: 1.tab位置,$ionicConfigProvider, tab ...
- DELL MD3200i存储控制器解锁方法
DELL MD3200i存储控制器解锁方法 现有一台DELL MD3200i存储,因种种原因导致控制器被锁定,这里是刚出厂的一台存储,出现这个问题让我们都很困惑,只能怀疑DELL公司的问题. 这台存储 ...
- windows系统利用任务管理器-资源监视器了解程序的磁盘读写量
场景摘要: 1.刚部署上线一个新功能,增加了日志输出模块 2.本身服务器资源已经紧张了,在增加日志输出,就想了解磁盘读写量 3.从中突然发现oracle的磁盘读写量比较大 4.在展开明细发现是or ...
- JAVA 连接 SQL Server 2008:java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
新项目需要修改Java开发的MES系统...Java忘的也差不多了...简单尝试以下JAVA连接SQL Server吧,没想到坑还是很多的.以前直接连oracle时没有这么多麻烦啊....可能微软和o ...
- .NET Core 环境下使用命令行移除某个 nuget 包的具体方法
.NET Core 使用Nuget包一般是先写入csproj文件,然后下载保存在\bin\Debug\netcoreapp2.0\publish\下,所以可以采用如下方案进行删除操作(其中netcor ...
- mnist手写数字检测
# -*- coding: utf-8 -*- """ Created on Tue Apr 23 06:16:04 2019 @author: 92958 " ...