【发布时间】:2012-06-20 01:18:49
【问题描述】:
我有一个自定义 Sharepoint 2010 Web 部件,它让用户完成注册过程中的一系列步骤。在每一步,当任何需要的输入完成时,用户单击继续按钮,这是一个标准的服务器端按钮控件。后面的代码在调用 Response.Redirect 之前会进行一些验证和数据库更新,后者会使用更新的会话数据刷新同一页面。
(注意:会话数据作为加密查询字符串参数保存在 URL 中,而不是常规的 Session 对象)
此解决方案在我的单服务器测试环境中运行良好,但一旦我将其部署到负载平衡阶段或生产环境,一些请求就会在单击继续 (ERR_TIMED_OUT) 后简单地超时而没有收到响应。
- Webpart 日志显示 Webpart 实际上正在使用有效 URL 调用 Response.Redirect
- 这不是服务器资源问题。超时时间可以设置为一分钟或更长时间,没有收到任何响应。
- 仅在部署到负载平衡服务器时发生
- 当我在其中一个负载平衡服务器上完成注册时,一切正常 - 这让我相信负载平衡和服务器会话存在问题。我知道,当从 NLB 中的一个服务器节点与负载平衡的 Web 应用程序交互时,所有请求都将发送到该特定服务器。
我知道我以前遇到过类似的问题,但那是几年前的事了,我不记得解决方案是什么了。
try
{
// get clean URL without query string parameters
string url;
if (string.IsNullOrEmpty(Request.Url.Query))
url = Request.Url.AbsoluteUri;
else
url = Request.Url.AbsoluteUri.Replace(Request.Url.Query, "");
// add encrypted serialized session object
url += "?" + Constants.QueryStringParameterData + "=" + SessionData.Serialize(true);
_log.Info("Redirecting to url '" + url + "'..");
Response.Redirect(url);
}
catch (Exception) { }
【问题讨论】:
-
不确定你是如何加密会话数据的,但是 IIRC 一些加密方法依赖于“机器密钥”,如果你场中的所有服务器都不相同,那么其他服务器就不会能够阅读它。这是视图状态,但同样适用 - codinghorror.com/blog/2004/11/…
标签: c# sharepoint web-parts nlb