我有一个自定义的 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) { }