gpt4 book ai didi

c# - 如何进行无缝代码推送(为什么 Page._fPageLayoutChanged 很重要)?

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:00 24 4
gpt4 key购买 nike

我们有一个无法解决的问题:如何在白天推送代码而不打扰最终用户。我是一名开发人员,我与我的系统部门合作。

设置:3 个 Windows 2008 IIS 7 框 - 1 个处于关闭状态,另外 2 个处于事件状态(使用共享配置),所有 3 个都支持 BigIP。我的站点设置为 1 个 Web 应用程序,下面有多个 Web 应用程序,所有 .NET 2.0。我们正在使用 stateserver,并为 View 状态设置了 machinekey。这种设置对我们来说相对较新,因为我们之前只有一台运行中的机器,而且它并不支持 BigIP。迁移到此设置的原因之一是为了无缝推送。

我在做什么:对其中一个网络应用程序进行代码更改。为此,我对下行节点进行更改,然后测试更改,然后复制到上行节点。

我遇到的情况取决于更改的代码部分。例如,我更改了 webconfig 中的一个值。当最终用户回发时,一切正常,因为他们在 webconfig 中使用了新值。我们非常喜欢这个!我还能够以某些无缝方式更改 dll 代码(在后端更改逻辑)。

然而,真正困扰我们的问题是:我在表单中添加了一个新标签。一旦我这样做,.Net 就像用户第一次加载表单一样,但他们的所有 View 状态都会保留。我专门将其追溯到 Page.IsPostBack 属性,并进一步通过反射将其追溯到 _fPageLayoutChanged。 _fPageLayoutChanged = true 当我通过推送将新内容添加到表单时。最终用户的体验是他们的内容仍然存在 b/c viewstate 仍然存在,但我在第一次加载时执行的操作全部被触发,并且他们试图执行的事件没有被连接起来。例如,如果他们按下一个按钮来保存他们的笔记,笔记仍然在屏幕上但是按钮点击事件没有被触发,因此他们的笔记没有被保存。根据页面架构,有时这就像用户需要再次单击保存一样温和,但也可能像代码抹掉他们所做的一样糟糕 b/c 它取决于 IsPostBack 来触发从数据库加载注释的代码.

这是来自网络的 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;
}
}

最后一行的评论让我很生气,因为它没有解释他们为什么做出那个决定。

此外,我不敢相信我们是唯一尝试在白天不打扰我们的最终用户的情况下推送代码并因此受阻的人。我们不知所措。我们需要更改 IIS 设置吗?重新构建我们的代码以使其不依赖于 IsPostBack 属性(但是事件仍然不会触发,因为当 IsPostBack 为 false 时 .NET 似乎无法正确连接它们)?有可能解决这个问题吗?

最佳答案

许多大型网站确实会不断部署更新。亚马逊是最著名的之一。查看此幻灯片 Continuous deployment .

一种方法是允许所有版本的代码同时运行,并根据“应该由版本 1.2.3.4 处理”cookie 等信息路由请求,从而决定哪个版本应该处理请求。

另一种方法是将向后兼容性内置到代码中。难以维护,但所需的基础设施明显减少 - 适合一次性案例。

关于c# - 如何进行无缝代码推送(为什么 Page._fPageLayoutChanged 很重要)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com