代码之家  ›  专栏  ›  技术社区  ›  Jean-Francois

asp.net、stateserver、NLB、会话丢失

  •  2
  • Jean-Francois  · 技术社区  · 17 年前

    关于stackoverflow的第一篇文章,希望能得到很好的反馈:)

    在测试设置时,我发现有时我们的会话会丢失。一天半后,结果如下:

    1. 是的,我们的machine.config都有相同的加密/解密密钥。
    2. 两个web应用程序都设置为“StateServer”,并且都指向同一台机器。

    从这一点上讲,在谷歌上搜索提供的信息和可能的解决方案就更少了。

    在尝试查找问题时,我看到一个请求将asp会话id cookie发送到服务器,但服务器没有将其映射到用户会话。

    因此,请求号x是从客户端发送的,带有cookie,会话被映射,一切都进行得很顺利。 请求号x+1与cookie一起从客户端发送,但未找到会话。

    以下是asp trace.axd的一个片段:

    请求详细信息 请求时间:11/26/2008 2:58:06下午状态代码:200 请求编码:Unicode(UTF-8)响应编码:Unicode(UTF-8)

    请求Cookies收集

    ASP.NET_会话ID j2ffvy45updpc52uhw1mbg55 42 援助22 9

    响应Cookies集合

    名称值大小

    标题集合

    Cookie ASP.NET_SessionId=j2ffvy45updpc52uhw1mbg55;援助=22

    第二项请求:

    请求详细信息 会话Id:请求类型:POST 请求时间:11/26/2008 2:58:08 PM状态代码:

    名称值大小

    名称值大小

    标题集合 名称值 Cookie ASP.NET_SessionId=j2ffvy45updpc52uhw1mbg55;援助=22

    正如您在第二个请求中所看到的,cookie是从客户端发送的,但asp似乎从未在其“请求cookies集合”中添加cookies。我想这就是它找不到会话的原因。

    请随时询问任何澄清。

    谢谢大家的反馈。

    8 回复  |  直到 14 年前
        1
  •  1
  •   Jean-Francois    17 年前

    我终于找到了问题的答案。它的起源在应用程序代码中(比如99%的程序员的第三方工具“bug”)。我决定无论如何都把它贴出来,以防有人遇到类似的情况。

    此代码是WebServiceRequester类的一部分。web服务请求者类在创建会话时实例化,并保存在会话中。在创建过程中,我们初始化成员“m_webServiceURL”,该成员在创建后保存在会话中。此成员初始化的值取决于本地计算机上的设置。

    WebServiceRequester类包含一个WebService对象。 无法在会话中保存WebService对象,它们不能在asp中序列化。该属性具有[NonSerialized]属性。因此,每次我们在页面生命周期中第一次访问对象的“WebService”属性时,我们都必须创建一个新的属性,并为其分配在会话中保存的url“m_webServiceURL”。 您可以看到,新的webservice对象可能位于不同的机器上,这意味着每台机器上的设置不同。

    框29设置为访问本地主机上的Web服务

    从技术上讲,它们都设置在同一台机器上。但这里有一个场景:

    登录框29。m_webServiceURL在会话中设置为localhost。

    [此处方框29中的一些请求]

    框30加载它的会话,创建一个新的webservice obect,其中localhost作为web服务地址。 框30向错误的web服务发出请求,导致会话过期异常。

    调试期间的一个问题是,网络监视器未记录本地通信。

    让我开始跟踪的原因是,box 29日志跟踪中从未记录过异常,这是它应该记录的。

    谢谢大家的建议,非常感谢。

    祝您今天过得愉快。 JF

        2
  •  0
  •   Andrew Rollings    17 年前

    很抱歉,这并不是你问题的严格答案,但它应该(a)修复它,或者(b)显著缩小它的范围。

        3
  •  0
  •   Andrew Rollings    17 年前

        4
  •  0
  •   DOK    17 年前

    使用数据库方法有其自身的问题。我认为你应该能够使用你喜欢的方法。

    可能 this session troubleshooting article

    或" Troubleshooting Session Related Issues in ASP.NET "

    或" Troubleshooting Expired ASP.NET Session State and Your Options "

        5
  •  0
  •   Andrei Rînea    17 年前

    我会站不住脚,重复MS SQL Server的建议。安装SQL Server Express,它是完全免费的,包括用于商业用途,并且它只有以下3个缺点,这在本阶段对您来说应该不是问题:

    • 最大4GB大小的数据库
        6
  •  0
  •   joeysim    17 年前

    • 在我们管理的一个生产环境中,我们使用MSSQL 2005 Express来管理会话,该站点每天有10万以上的用户和20万以上的页面。如果会话是必须的,并且与应用程序紧密耦合,建议使用这种方法。

        7
  •  0
  •   Brendan Kowitz    17 年前

    不要乱搞SQL,而是直接将测试发送到IIS节点中,看看是否仍然存在相同的问题。我相信,如果您只做少量测试,StateServer将不会成为问题。

        8
  •  0
  •   rajesh pillai    17 年前

    默认情况下,ASP.net_SessionID cookie域名设置为完整的应用程序路径。因此,这可能是曲奇没有旅行的原因之一。

    例如。 Request.Cookies[“ASP.NET_SessionId”].Domain=“.yourdomain.com”。

    推荐文章