我们有一个我们无法解决的问题:如何在没有最终用户中断的情况下在白天推送代码。我是一名开发人员,我正在与我的系统部门一起工作。
设置: 3 个 Windows 2008 IIS 7 框 - 1 个处于关闭节点,另外 2 个处于活动状态(具有共享配置),所有 3 个都位于 BigIP 后面。我的网站设置为 1 个 Web 应用程序,下面有多个 Web 应用程序,全部为 .NET 2.0。我们正在使用 stateserver 和一个 set machinekey 用于 viewstate。这种设置对我们来说相对较新,因为我们以前只有一台 live 机器,而且它不在 BigIP 后面。迁移到此设置的一个原因是无缝推送。
我在做什么:对其中一个 Web 应用程序进行代码更改。为此,我对向下节点进行更改,然后测试更改,然后复制到向上节点。
我所经历的取决于代码的哪一部分发生了变化。例如,我在 webconfig.xml 中更改了一个值。当最终用户回帖时,一切正常,因为他们使用了 webconfig 中的新值。我们非常喜欢这个!我还能够以某些无缝的方式更改 dll 代码(更改后端的逻辑)。
然而,真正困扰我们的问题是:我在表单中添加了一个新标签。一旦我这样做了,.Net 就像用户第一次加载表单一样,但他们的所有视图状态都被保留了。我专门将此追溯到Page.IsPostBack 属性,并进一步通过反射将其追溯到_fPageLayoutChanged。_fPageLayoutChanged = true 当我通过推送将新内容添加到表单时。最终用户的体验是他们的内容仍然存在 b/c 视图状态仍然存在,但是我在第一次加载时执行的操作全部触发,并且他们尝试执行的事件没有被连接起来。例如,如果他们按下一个按钮来保存他们的笔记,这些笔记仍然在屏幕上,但是按钮点击事件没有被触发,因此他们的笔记没有被保存。根据页面架构,
这是来自网络的 IsPostBack 的代码(这是伤害我们的最后一部分):
public bool IsPostBack {
get {
if (_requestValueCollection == null)
return false;
// Treat it as postback if the page is created thru cross page postback.
if (_isCrossPagePostBack)
return true;
// Don't treat it as a postback if the page is posted from cross page
if (_pageFlags[isCrossPagePostRequest])
return false;
// If we're in a Transfer/Execute, never treat as postback (ASURT 121000)
// Unless we are being transfered back to the original page, in which case
// it is ok to treat it as a postback (VSWhidbey 117747)
// Note that Context.Handler could be null (VSWhidbey 159775)
if (Context.ServerExecuteDepth > 0 &&
(Context.Handler == null || GetType() != Context.Handler.GetType())) {
return false;
}
// If the page control layout has changed, pretend that we are in
// a non-postback situation.
return !_fPageLayoutChanged;
}
}
最后一行的评论杀死了我,b/c 它没有解释他们为什么做出这个决定。
此外,我不敢相信我们是唯一一个在白天尝试推送代码而不中断最终用户并因此而受挫的人。我们不知道该怎么办。我们是否需要更改 IIS 设置?重新设计我们的代码,使其不依赖于 IsPostBack 属性(但事件仍然不会触发,因为当 IsPostBack 为 false 时,.NET 似乎无法正确连接它们)?绕过这个甚至可能吗?