1

有大量关于导致 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() + "\">");

这段代码非常简单,在 Test 中可以完美运行。但是,在生产环境中,在重负载下,它有大约 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 No Web Gardening 我们正在运行一个网络场,但用户不断返回到同一台服务器。我现在正在研究是否有任何方式用户可能会溜到另一台服务器上。

4

2 回答 2

0

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

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

http://aspalliance.com/1182

于 2010-11-12T17:41:25.613 回答
0

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

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

于 2010-11-12T19:16:32.307 回答