NLB环境中的Response.Redirect超时

时间:2012-06-20 01:18:50

标签: c# sharepoint web-parts nlb

我有一个自定义的Sharepoint 2010 Web部件,它通过注册过程中的一系列步骤来运行用户。在每一步,当完成所需的输入时,用户单击继续按钮,这是标准的服务器端按钮控件。后面的代码在调用Response.Redirect之前进行了一些验证和数据库更新,它使用更新的会话数据刷新同一页面。

(注意:会话数据作为加密查询字符串参数保存在URL中,而不是传统的Session对象)

此解决方案在我的单一服务器测试环境中运行良好,但只要我将其部署到负载平衡阶段或生产环境,某些请求会在单击Continue(ERR_TIMED_OUT)后立即超时而不会收到响应。

  1. Webpart日志显示webpart实际上是使用有效的URL调用Response.Redirect
  2. 这不是服务器资源问题。超时可以设置为一分钟或更长时间,不会收到响应。
  3. 仅在部署到负载平衡服务器时发生
  4. 当我在其中一个负载平衡服务器上完成注册时,一切正常 - 这让我相信负载平衡和服务器会话存在问题。我知道当从NLB中的一个服务器节点与负载平衡的Web应用程序交互时,所有请求都将转到该特定服务器。
  5. 我知道我之前遇到过类似的问题,但几年前我已经记不起解决方案了。

            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) { }
    

2 个答案:

答案 0 :(得分:1)

好的,问题已经解决了。

原来是UAG在后台做了一些事情,我发现它的方式是触发回发的链接从

改变了

http://some_url.com/sites/work/al2343/page.aspx

http://some_other_url.domain.com/uniquesigfed6a45cdc95e5fa9aa451d1a37451068d36e625ec2be5d4bc00f965ebc6a721/uniquesig1/sites/work/al2343/page.aspx

(注意那里的“uniquesig”)

这是浏览器实际尝试重定向到的URL,但由于UAG的问题,导航冻结了。

我不知道他们是如何解决的,但至少问题不在我的组件中。

答案 1 :(得分:0)

Request.Url的一种可能性是特定服务器如何看到网址(类似http://internalServer44/myUrl),而不是外部可见的负载均衡的Ulr(如http://NlbFarmUrl/myUrl)。

对于SharePoint,最好使用SPContext.Current.Site/Web属性来获取Url的基本部分,因为此Url应该已经是外部可见的形式。