【问题标题】:IIS ASP.NET InProc session variables randomly not written to sessionIIS ASP.NET InProc 会话变量随机未写入会话
【发布时间】:2011-05-09 04:36:21
【问题描述】:

有大量关于导致 InProc 会话删除会话对象的信息,但这不是这里发生的事情。我们在稳定的 InProc 会话对象中缺少单个变量,并且不确定它们是没有被写入还是在成功写入后丢失。我已向 WinDBG 确认会话是实时的,并且包含写入它们的部分数据,但不是全部。

Guid g = System.Guid.NewGuid();
this.Context.Session.Add(g.ToString(), result.ImageData);           
output.Write("<img src=\"display.aspx?id=" + g.ToString() + "\">");

这段代码非常简单,在测试中可以完美运行。但是,在生产环境中,在重负载下,它有大约 1% 的时间会失败。如果 Smith 先生访问该站点并尝试显示 4 条图像数据,则其中 2 条可能会保存在他的会话中,而其中 2 条可能会丢失。

史密斯先生的 InProc 会话对象存在。流量日志显示他点击了 4 次,每次都有不同的 id 参数。但是他的 InProc 会话对象中只有 2 个 guid,而不是 4 个。我们捕获的 2 个会话对象确实对应于流量日志中显示的 2 个 id(他的第一次和第三次点击)。他的第二次和第三次点击的流量日志但是,第 4 次单击显示了一个不在他的 InProc 会话对象中的 guid id。

上述代码的第 1 行和第 3 行显然适用于第 2 次和第 4 次点击,否则他在 URI 中没有 id 供他点击。然而,第 2 行似乎以某种方式默默地失败了。如果抛出任何异常,我希望我们永远不会到达第 3 行。我看不到用户接收 guid id 的任何方式,但会话无法获得它。另一种可能是第 2 行运行成功,但变量后来消失了,我什至无法想象。

谁能想到别的?或者可能是关于重现此类问题的方法的建议?

详情: ASP.NET v3.5 IIS 6 没有网络园艺 我们正在运行一个网络农场,但用户不断返回到同一台服务器。我现在正在研究是否有任何方式用户可能会溜到另一台服务器上。

【问题讨论】:

  • 我会对那些溜到另一台服务器的人付出代价。过去看到过类似的事情,“粘性会话”并不总是像他们所说的那样!
  • 考虑到高负载,您是否可能内存不足?你有没有介绍过这个?另外,您是否也在开发中经营一个农场?
  • 是的。滑动式。我不是网络专家,我误解了全球站点选择器与内容切换器相比的功能。我们生活和学习。至于记忆,我确实深入挖掘过,很好的建议。

标签: asp.net inproc


【解决方案1】:

如果可能在您的情况下,您可以通过在场中的每台服务器上使用相同的机器密钥来绕过粘性会话的需要。

http://www.asp101.com/tips/index.asp?id=165

【讨论】:

  • 实际上,machineKey 解决方案适用于 ViewState,而不是会话状态。 InProc 会话状态不是 machineKey 加密的,所以它对我的情况没有影响。我们的机器密钥已经在我们所有的农场同步了很长时间了。
【解决方案2】:

好吧,确定问题是否是由于负载均衡器和粘性会话的一种简单方法是完全停止使用它并查看问题是否重现。

如果不可能,您可以将会话存储在进程 [状态服务器] 之外并再次检查会话。我曾在 Microsoft 全球技术支持部门工作,见过很多粘滞会话不起作用的情况!

http://aspalliance.com/1182

【讨论】:

  • 是的。感谢您的想法。我们正在寻找 proc,但暂时无法关闭开关。
  • 确实是用户去了不同的农场成员。我们使用的是全局站点选择器,而不是我们通常的内容切换路由解决方案。 GSS 发送一个或另一个 IP 地址以响应客户端的 DNS 查询。该 DNS 回复的 TTL 为 20 秒,这意味着 DNS 回复过早过期,不实用。短期解决方案是延长 TTL。长期解决方案是进程外会话管理。
猜你喜欢
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多