有大量关于导致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%的时间内失效。如果史密斯先生访问该网站并试图显示4个图像数据,其中2个可能会保存在他的会话中,其中2个丢失。
史密斯先生的InProc会话对象存在。流量日志显示他点击了4次,每次都有不同的id参数。但是他的InProc会话对象中只有2个guid,而不是4个。我们捕获的2个会话对象确实对应于流量日志中显示的2个id(他的第1次和第3次点击。)他的第2次和第3次流量记录但是,第四次点击会显示一个不在他的InProc会话对象中的guid id。
上述代码的第1行和第3行显然适用于第二次和第四次点击,或者他没有在URI中使用id来供他点击。然而,第2行似乎在某种程度上无声地失败了。如果抛出任何异常,我希望我们永远不会到达第3行。我看不到任何方式让用户接收guid id,但会话没有得到它。另一种可能性是第2行成功运作,但变量后来消失了,我甚至无法想象。
有人能想到别的吗?或者也许建议一种方法来重现这样的问题?
详细说明: ASP.NET v3.5 IIS 6 没有网络园艺 我们正在运行Web场,但用户经常返回到同一台服务器。我现在正在研究是否有任何方式用户可能会滑向其他服务器。
答案 0 :(得分:0)
好吧,通过负载均衡器和粘性会话找出问题的简单方法是完全停止使用它并查看问题是否重现。
如果无法做到这一点,您可以将会话存储在进程[状态服务器]之外并再次检查会话。我曾在Microsoft全球技术支持部门工作,并且看到很多情况下粘性会话无效!
答案 1 :(得分:0)
如果可能,在您的情况下,您可以通过在服务器场中的每台服务器上使用相同的计算机密钥来绕过粘性会话的需要。