我们知道在asp.net WebFarm下共享Session(StateServer模式),各站点在IIS中的Instance ID必须是一样的,为了这个微软还专门有个KB来说明。这个共享Session是建立在域名一样的情况下,才能有效。
但,如果域名不一样,但是ID一样,是不是也可以通过StateServer共享Session呢?
比如site1.domain.com;site2.domain.com,是不是可以共享Session呢?
我做了个实验,把这个两个站点保存SessionId的Cookie.Domain设置成顶级域名就可以共享SessionId了,即设为Cookie.Domain="domain.com".大家看看,我提问的问题,可有人知道StateServer和IIS之间的联系方式?

解决方案 »

  1.   

    再说明一下,能共享"SessionId",并不代表可以共享Session了?
      

  2.   

    state server 
    session 会被存在state server上一个名为aspnet_state.exe的service的内存中,这个service是一个独立的进程, 
    可以运行在和IIS不同的机器上, 防止工作进程崩溃后session丢失. 
    首先要启动 service : net start aspstate 
    再在web.config中设定mode,server, port 
    <configuration> 
    <sessionstate mode=”stateserver” 
    cookieless=”false” 
    timeout=”20″ 
    server=”127.0.0.1″ 
    port=”42424″ /> 
    </configuration>
      

  3.   

    Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下: mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" 使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。
      

  4.   

    2楼的,你说的这些,偶都明白
    偶问得是:如果域名不一样,但是站点的 Instance ID一样,是不是也可以通过StateServer共享Session??
      

  5.   

    楼主可自己试一下,通过修改host文件,为自己的机器指定几个域名,然后建几个网站测试一下.
      

  6.   

    MARK 学习一上 结贴的时候 我回来看
      

  7.   

    我测试的结果是不行的,不是有没有高人知道为什么不行?
    到底StateService是怎么区分不同站点的Session的呢?
      

  8.   

    应该是可以的,只要你能做到不同域名站点在IIS中的Instance ID是一样的我以为你要讨论StateServer和IIS之间的联系方式???呵呵
      

  9.   

    ckpckphaha(赫尔墨斯神杖)
    你说的没错,我最终的问题就是 StateServer怎么区分不同Instince的?
    但是我做的测试,即使是一样的InstanceId,域名不同Session不能共享,虽然SessionId共享了?
      

  10.   

    建议你用Cookies然后建立一个域,Cookies就写到主域地址中,这样即使你站点多也都是在一个主域下应用Cookies,或可以考虑表单认证。
      

  11.   

    应该是不行的,跨域的话考虑SSO的方案,专门开一台Session服务器,所有网站都跳转到这个服务器上验证Session
      

  12.   

    http://topic.csdn.net/t/20050308/10/3832772.html
      

  13.   

    http://topic.csdn.net/t/20050308/10/3832772.html
    cpp2017(慕白兄) 那位同学想在一台机器上实现共享,基本不可能的,因为同一台服务器的不同WebSite Id的肯定是不同的,所有肯定不能共享地:)
      

  14.   

    To hanguoji84(北飘)
    SessionId一样,是可以使用表单认证,但是Session的值还是不能共享,郁闷中...To LoveCherry
    我猜测也不行,要不然,大家都不要辛苦做什么SSO方案了:)
    但为什么不行,微软也没有什么说法,要是有什么文档的话,估计应该可以解决的。
      

  15.   

    或许可以反编译asp.net SessionState 模块的源码分析一下:)
    周末有空分析下,有那位高手愿意和我一起分析:),或许可以找到解决的方法
      

  16.   

    Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下: mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" 使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中
      

  17.   

    不知道 楼主说的 KB 是不是 下面的http://support.microsoft.com/default.aspx?scid=kb;zh-cn;325056
    不过猜测 StateServer 对于 不同 服务器 之间的共享 除了 域的验证 肯定 在服务器通信期间 会加入IP的验证来区别不同的服务器吧
      

  18.   

    to hertcloud(·£孙子兵法£·) :
    没错就是这个KB,IP验证应该不可能,因为在Web Farm的情况下,各台服务器的IP都是不一样的。
    关于域的验证,我觉得是通过SessionId来区分的,默认情况下asp.net保存SessionId的Cookie.Domain属性是不一样的,是全域名的,当时可以手工改这个Domain的值,强制让他们一样。我做了测试,好像还是不行。
    hertcloud 说域的验证可有什么依据?
      

  19.   

    看看这个http://tech.acnow.net/Html/Program/NET/NETOther/2004-2/1/090702830.shtmlhttp://msdn2.microsoft.com/en-us/library/aa479041.aspxhttp://www.codeproject.com/aspnet/ASPNETSessionInternals.asp
      

  20.   

    谢谢 hertcloud(·£孙子兵法£·)  先,研究一下
      

  21.   

    初步断定和三个因素有直接关系:
    1.SessionId
    2.HttpRuntime.AppDomainAppId
    3.Machine.Config中ValidationKey
      

  22.   

    hertcloud(·£孙子兵法£·) 
    说的好,像这种好东东,研究好了共享一下,不胜感激
      

  23.   

    理论上以下三个值相同就可以了
    1.SessionId
    2.HttpRuntime.AppDomainAppId
    3.Machine.Config中ValidationKey可是,我测试下来还是不行! 估计可能还有别的因素
      

  24.   

    测试成功了!和大家分享:
    1.保证各子站点SessionId相同,设置Cookie.Domain=".youdomain.com" 就可以了
    2.HttpRuntime.AppDomainAppId 一致,其就是就是站点的Instance ID一致,具体请查考   http://support.microsoft.com/default.aspx?scid=kb;zh-cn;3250563.Web.config中配置machineKey相,不要用系统默认的,要自己生成。怎么生成machinekey, msdn上也有文章介绍的。
    另外,我刚才没有测试成功,好像因为我改了web.config.comments这个配置文件,仅改这个似乎不行。还要该web.config文件。好了,谢谢大家的关注!
      

  25.   

    dropdownlist没有文本输入框框的,我想用层做一个输入框框,我的dropdownlist是动态生成的,这个时候我就要将层移动到dropdownlist上去。请问我怎么获取dropdownlist的坐标值,然后让层覆盖该dropdownlist?
    以下帖子给分。
    如何在C#.net WEB2005开发中获取dropdownlist在网页中的位置坐标?
    http://community.csdn.net/Expert/topic/5481/5481151.xml?temp=.4136316
      

  26.   

    dropdownlist没有文本输入框框的,我想用层做一个输入框框,我的dropdownlist是动态生成的,这个时候我就要将层移动到dropdownlist上去。请问我怎么获取dropdownlist的坐标值,然后让层覆盖该dropdownlist?
    以下帖子给分。
    如何在C#.net WEB2005开发中获取dropdownlist在网页中的位置坐标?
    http://community.csdn.net/Expert/topic/5580/5580708.xml?temp=.7489435
    发错连接,更正在发送。