asp.netSession共享的解决方案

1.iis7.0webconfig配置

  <sessionState mode="StateServer" stateConnectionString="tcpip=172.18.84.162:8023"  cookieless="false" timeout="120"/>
    <authentication mode="Windows" />
  </system.web>
  <system.webServer>
  <modules>
      <add name="mysession" type="aspnetstate_webformtest.mysession, aspnetstate_webformtest"/>
    </modules>
  </system.webServer>

2.截取类,重置sessionid的值

namespace aspnetstate_webformtest
{
    public class mysession : IHttpModule
    {
        private string m_RootDomain = string.Empty;

        #region IHttpModule Members

        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            m_RootDomain = "test.com";

            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, m_RootDomain);

            context.EndRequest += new System.EventHandler(context_EndRequest);
        }

        void context_EndRequest(object sender, System.EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            for (int i = 0; i < app.Context.Response.Cookies.Count; i++)
            {
                if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
                {
                    app.Context.Response.Cookies[i].Domain = m_RootDomain;
                }
            }
        }

        #endregion
    }
}

3.模拟同一个域名Nginx的配置

upstream myServer {
    server localhost:8024;
    server 172.18.89.5:8024;
}

server{
  listen       1009;
        server_name  localhost ;

 location / {
            proxy_pass http://myServer/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_redirect off;
        }
}

参考:

Session共享的解决方案

1、客户端SessionID值唯一;

对于不同的域名:主域名、子域名、跨站点域名或跨服务器域名,用户在打开页面时会产生不同的SessionID,

为了使这些站点在用户登录时只登录一次,那我们就要解决SessionID的问题,必须使SessionID在这些共享Session的站点中只产生一次。而SessionID是存储在客户端的cookie之中键值为ASP.NET_SessionId的一个字符串(也可以存储在URL中,这里不作使介绍),为此只须使各站点存储的SP.NET_SessionId唯一即可。

因每个客户端在打开时会产生一个SessionID,为此我们要做的就是重置SessionID。我们可以在继承HttpModule,在结束请求时重写SessionID。

    public class MakeSessionIDOneOnly : IHttpModule
    {
        private string m_RootDomain = string.Empty;

        #region IHttpModule Members

        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            m_RootDomain = ConfigurationManager.AppSettings["RootDomain"];

            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, m_RootDomain);

            context.EndRequest += new System.EventHandler(context_EndRequest);
        }

        void context_EndRequest(object sender, System.EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            for (int i = 0; i < app.Context.Response.Cookies.Count; i++)
            {
                if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
                {
                    app.Context.Response.Cookies[i].Domain = m_RootDomain;
                }
            }
        }

        #endregion
    }

为使用以上代码,须配置下面节点项。

<httpModules>

<add name="节点名称" type="类名全称, 程序集"/>

</httpModules>

2、Session值的共享;

配置sessionState置节点,使用StateServer或SQLServer来实现Session共享。

为实现跨服务器共享,必须在Web.config配置:

<machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>

并且,不同服务器上站点配置必须用相同的Web.config,各站点目录配置也要相同。

2.1、使用StateServer:

存储Session的服务器必须开启StateServer:ASP.NET状态服务。只有机器重起的情况下才导致Session丢失。

<sessionState cookieless="false" timeout="50" mode="StateServer" stateConnectionString="tcpip=IpAddress:42424"/>

若StateServer在本机存储,则IpAddress为:127.0.0.1;若StateServer为远程服务器,则为IpAddress为远程服务器IP地址,并且修改注册表项如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters]

"Port"=dword:0000a5b8

"AllowRemoteConnection"=dword:00000001

2.2、使用SQLServer:

必须开启SQLServer代理服务,此服务负责清除过期的Session,若没有开服务,则Session不会过期。

使用SQLServer在机器重启后Session不会丢失。

Web.config配置:

<sessionState mode="SQLServer" sqlConnectionString="server=DBIpAddress; uid=myid; pwd=mypwd;"/>

数据库配置:

使用aspnet_regsql.exe工具

ASP.NET 2.0版本后微软提供了aspnet_regsql.exe工具可以方便的配置Session数据库.该工具位于 Web 服务器上的"系统根目录\Microsoft.NET\Framework\版本号"文件夹中.

使用举例:

aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p

-S参数:

表示数据库实例名称. 可以用"."表示本机.

-U和-P参数:

表示用户名和密码.

-E参数:

可以再-U –P 与 -E中选择一组. –E表示以当前系统用户通过windows身份验证登录数据库, -U -P则是使用SqlServer用户登录数据库.

-ssadd / –ssremove 参数:

-ssadd表示是添加Session数据库, -ssremove表示移除Session数据库.

sstype 参数说明:


t


将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。


p


将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。


c


将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称。

sessionState参数说明:


属性


说明


allowCustomSqlDatabase


可选的 Boolean 属性。

指定会话状态 SQL 数据库是否可以是自定义数据库(而不是 ASP.NET 默认数据库)。如果为 false,则不能指定初始目录或数据库作为 sqlConnectionString 属性的值。默认会话状态 SQL 数据库为 ASPState 数据库。有关更多信息,请参见会话状态模式。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 false。


cookieless


可选的 HttpCookieMode 属性。

指定对于 Web 应用程序使用 Cookie 的方式。

cookieless 属性可以为下列可能值之一。默认值为 UseCookies。



说明


AutoDetect


ASP.NET 确定请求浏览器或请求设备是否支持 Cookie。如果请求浏览器或请求设备支持 Cookie,则 AutoDetect 使用 Cookie 来保留用户数据;否则,将在查询字符串中使用一个标识符。如果浏览器或设备支持 Cookie,但当前禁用了 Cookie,则请求功能仍会使用 Cookie。


UseCookies


无论浏览器或设备是否支持 Cookie,都使用 Cookie 来保留用户数据。


UseDeviceProfile


ASP.NET 根据 HttpBrowserCapabilities 设置来确定是否使用 Cookie。如果 HttpBrowserCapabilities 设置指示浏览器或设备支持 Cookie,将使用 Cookie;否则,将在查询字符串中使用一个标识符。


UseUri


无论浏览器或设备是否支持 Cookie,调用功能都使用查询字符串来存储标识符。


cookieName


可选的 String 属性。

指定存储会话标识符的 Cookie 的名称。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 "ASP.NET_SessionId"。


customProvider


可选的 String 属性。

指定用于存储和检索会话状态数据的自定义会话状态提供程序的名称。该提供程序在 providers 元素中指定。仅当会话状态模式设置为 Custom 值时,才使用该提供程序。有关更多信息,请参见会话状态模式。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为空字符串 ("")。


mode


可选的 SessionStateMode 属性。

指定存储会话状态值的位置。有关更多信息,请参见会话状态模式。

mode 属性可以为下列可能值之一。默认值为 InProc。



说明


Custom


会话状态将使用自定义数据存储区来存储会话状态信息。


InProc


会话处于正在处理 ASP.NET 辅助进程的状态。


Off


会话状态被禁用。


SQLServer


会话状态将使用进程外 SQL Server 数据库来存储状态信息。


StateServer


会话状态将使用进程外 ASP.NET 状态服务来存储状态信息。


partitionResolverType


可选的 String 属性。

指定在哪里存储会话状态。如果 partitionResolverType 属性中指定了值,则忽略 sqlConnectionString 和 stateConnectionString 属性。PartitionResolverType 属性返回的连接字符串将用于每个请求,为请求的其余部分连接到适当的服务器位置。如果连接字符串无效,ASP.NET
将引发一个异常,该异常与当配置的服务器连接字符串无效时引发的异常相同。该属性用于在 SQL 或状态服务器模式下在多个后端节点上划分会话状态数据。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为空字符串。


regenerateExpiredSessionId


可选的 Boolean 属性。

指定当客户端指定了过期的会话 ID 时是否重新发出会话 ID。默认情况下,当启用了 regenerateExpiredSessionId 时,仅为 cookieless 模式重新发出会话 ID。有关更多信息,请参见 IsCookieless。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 true。


sqlCommandTimeout


可选的 TimeSpan 属性。

指定使用 SQL Server 会话状态模式的 SQL 命令的持续时间超时(秒)。持续时间超时是 SQL 命令可以处于空闲状态的时间(秒),超过此时间之后,该命令将被取消。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 0:00:30(30 秒)。


sqlConnectionString


可选的 String 属性。

为运行 SQL Server 的计算机指定连接字符串。该属性在 mode 属性设置为 SQLServer 值时是必需的。有关更多信息,请参见会话状态模式。


注意


若要在使用 SQLServer 模式时提高您的应用程序的安全性,请使用受保护的配置来加密配置的 sessionState 节,以帮助保护 sqlConnectionString 值。

默认值为 "data source=127.0.0.1;Integrated Security=SSPI"。


stateConnectionString


可选的 String 属性。

指定远程存储会话状态的服务器名称或地址以及端口。端口值必须为 42424。当 mode 为 StateServer 值时,该属性是必需的。确保运行 ASP.NET 状态服务的服务器是存储会话状态信息的远程服务器。该服务随 ASP.NET 一起安装,默认情况下为 %SystemRoot%\Microsoft.NET\Framework\VersionNumber\aspnet_state.exe。有关更多信息,请参见会话状态模式。


注意


若要在使用 StateServer 模式时提高您的应用程序的安全性,请使用受保护的配置来加密配置的 <sessionState> 节,以帮助保护 stateConnectionString 值。

默认值为 "tcpip=127.0.0.1:42424"。


stateNetworkTimeout


可选的 TimeSpan 属性。

指定 Web 服务器与状态服务器之间的 TCP/IP 网络连接可以处于空闲状态的时间(秒),超过此时间后,请求将被取消。该属性在 mode 属性设置为 StateServer 值时使用。

默认值为 10 秒。


timeout


可选的 TimeSpan 属性。

指定在放弃一个会话前该会话可以处于空闲状态的分钟数。对于进程内和状态服务器模式,timeout 属性不能设置为大于 525,601 分钟(1 年)的值。

会话 timeout 配置设置仅适用于 ASP.NET 页。更改会话 timeout 值不会影响 ASP 页的会话超时时间。同样,更改 ASP 页的会话超时时间不会影响 ASP.NET 页的会话超时时间。

默认值为 20 分钟。


useHostingIdentity


可选的 Boolean 属性。

指定会话状态将恢复为宿主标识还是使用客户端模拟。

如果为 true,ASP.NET 将使用下列进程凭据之一来连接会话状态存储区:

宿主进程;对于 Microsoft Internet 信息服务 [IIS] 5 和 5.1 版为 ASPNET,对于 Microsoft Windows Server 2003 则为 NETWORK SERVICE。

应用程序模拟标识,当使用了以下配置时使用此凭据:

<identity impersonate="true" userName="user" password="pwd" />

如果为 false,ASP.NET 将使用目前与当前请求的操作系统线程关联的凭据来连接会话状态存储区。对于客户端模拟,ASP.NET 将使用与浏览器协商的安全凭据来连接会话状态存储区。如果为 false,ASP.NET 在连接会话状态存储区时不会恢复为进程标识或应用程序模拟标识。有关更多信息,请参见
ASP.NET 模拟。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 true。


注意


在 .NET Framework 1.1 版中,如果 mode 属性设置为 SQLServer,并且客户端模拟有效,则 ASP.NET 使用来自 ASP.NET 客户端模拟的客户端凭据连接到运行 SQL Server 的计算机。


继承的属性


可选的属性。

由所有节元素继承的属性。

作者:xinhaijulan

出处:http://xinhaijulan.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-10-05 12:03:01

asp.netSession共享的解决方案的相关文章

如何实现Asp与Asp.Net共享Session

<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe> 在.ne

Session共享的解决方案

http://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html 1.客户端SessionID值唯一: 对于不同的域名:主域名.子域名.跨站点域名或跨服务器域名,用户在打开页面时会产生不同的SessionID, 为了使这些站点在用户登录时只登录一次,那我们就要解决SessionID的问题,必须使SessionID在这些共享Session的站点中只产生一次.而SessionID是存储在客户端的cookie之中键值为ASP.NET_

.net,sessionState的Session共享问题解决方案

最近项目因为要负载均衡所以就使用了sessionState的Session共享,但是却发现多台服务器中有个别服务器的Session没有共享,于是就有了这篇文章,下面开始说说. 这个基本上就分两种情况:一种就是在多台服务器上,在IIS中建立的网站的标识符一样(要想都一样,需要在建网站的时候输入同样的描述符,就我知道的方 法,只有在第一次建这个网站的时候,输入的描述符要一样,建好后再改描述符是没用的,它会保留以前的标识符,另外这种情况有一个特例,就是默认网站,虽然 在iis中可以看到默认网站的标识符

集群中的session共享问题解决方案

一. 大致说一下nginx的负载均衡策略 1.轮询(默认): 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响. 2.weight: 指定轮询权重,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况. 3.ip_hash: 每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题.(此为解决session共享的一种方式) 4.fair(第三方):

asp.net 分布式探讨之Session共享问题

---恢复内容开始--- Session共享是分布式架构设计中的一大难点,尽管session共享的解决方案不少,但是.net 下的解决方案还是比较少,而且说明文档也很少. 之前尝试用memcached缓存session,以解决session共享问题,后来发现实在是没有解决方案,github上有一个MemcachedSessionProvider,但是我并没有成功,还在博客园的博问上说了这个问题,但是至今无人回我,链接asp.net MemcachedSessionProvider 如何实现ses

不拖控件ASP.NET——探知cookie和session(2)

    接着上篇的博客我们来讲解服务器端保存数据的机制-session     我们知道cookie是保存在客户端的,这样数据就存在一个不安全性,此外还有 一个问题就是不能够存储大量的数据,我们上篇博客还遗留一个问题就是客户端是可以篡改数据的,相当于保留在病人手上的病历本是可能被用户篡改的(一般情况下,用户不会篡改,这样多危险了,医生误诊怎么办?哈哈)     此外医生会给每个患者编制一个编号,并且自己再保存一个编号,这样当病人来的时候根据编号来识别病人的身份,当然用户会可以别人的编号猜出来自己

深入理解asp.net SessionState

web Form 网页是基于HTTP的,它们没有状态, 这意味着它们不知道所有的请求是否来自同一台客户端计算机,网页是受到了破坏,以及是否得到了刷新,这样就可能造成信息的丢失. 于是, 状态管理就成了开发网络应用程序的一个实实在在的问题.    在ASP中能够通过Cookie .查询字符串. 应用程序.会话(Session) 等轻易解决这些问题.现在在ASP.NET环境中,我们依然可以使用这些功能,并且功能更加强大.状态管理分为服务端和客户端两种情况, 这里只是介绍 服务端状态管理: 与Appl

asp.net 状态的传递和保存

http无状态 Http协议是无状态的,不会记得上次和网页"发生了什么"(故事<初恋50次>). 试验:private 字段++.服务器不记的上次给了浏览器什么,否则服务器的压力会太大,浏览器需要记住这些值,下次再提交服务器的时候(请在我的宽度基础上增加10,)就要把上次的值提交给服务器,让他想起来.如果要知道上一次的状态,一个方法是在对浏览器响应结束之前将状态信息保存到页面表单中(实现一下),下次页面再向服务器发出请求的时候带上这些状态信息,这样服务器就能根据这些状态信息

分布式中使用Redis实现Session共享(二)

上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+iis实现负载均衡搭建负载均衡站点了,这里我们会搭建两个站点来验证redis实现的session是否能共享. 阅读目录 Session实现原理 session共享实现方案 问题拓展 总结 回到顶部 Session实现原理 session和cookie是我们做web开发中常用到的两个对象,它们之间会不会