2

我最近在另一个论坛上与另一个开发人员进行了讨论,主题是 ASP.NET 中的代码重用。所述场景是他需要在服务器正常运行期间频繁更新生产服务器上的代码,这会导致所有用户的 Session 被重置。他避免将共享代码或类放入 App_Code 文件夹或将预编译的 DLL 放入 Bin 文件夹,因为任何更新也会刷新会话。

他提出的解决方案是将他的共享代码放入 UserControls 并在需要的地方引用它们。这使他能够仅更新将在下一次请求时动态重新编译的 UserControl 文件,而无需强制重新启动会话。请注意,用户控件不打算有任何 UI,它们可能只包含一些业务逻辑。

我试图说服他不要这样做,因为这对我来说本质上是错误的——但我无法提供任何确凿的事实来支持我的说法,即这是一种非常糟糕的做事方式。我唯一能想到的是它违反了业务逻辑与UI分离的原则。我是大错特错还是有具体的理由不应该这样做?链接或示例会有所帮助。

注意:目前不能选择使用进程外会话状态,他们也无法决定计划的停机时间。此外,由于这是一个正在积极开发的站点,他们似乎还没有使用任何专业的部署模型。

提前致谢。

编辑:此外,如果有人能准确地阐明会话在上述情况下重新启动的原因,那将会很有帮助。

4

6 回答 6

2

听起来主要问题是他过于频繁地更新生产代码。除此之外,UserControls 似乎是一个放置业务逻辑的完全合理的地方,特别是如果您对它们有良好的命名约定或者可以将它们放在一个公共文件夹中。

于 2009-02-05T19:24:09.617 回答
2

请问,为什么进程外会话状态不是一个选项,真的吗?既然这家伙似乎为了解决这个“问题”付出了很多努力,他不应该寻找更好的解决方案吗?进程外会话状态是唯一好的解决方案。

于 2009-02-05T19:24:23.363 回答
2

这似乎是一种不寻常的方法,持久会话是显而易见的答案。假设不使用持久会话的理由是合法的,有时您只需要使用任何可行的方法。我会在源文件中明确记录用户控件的不寻常使用并接受它。

回答为什么会话会重置编辑。在进程会话中,所有会话数据都作为应用程序的一部分在内存中。对网站的各种更改(例如 web.config 和其他我不记得的)会导致应用程序重新启动,清除应用程序中的所有当前状态。坚持 SQL 或进程外会话状态服务器将允许应用程序重置并丢失任何状态,而不会影响会话数据。

于 2009-02-05T19:27:48.020 回答
1

我同意 Dennis 的观点,从 inproc 转移到状态服务器确实没有问题。不确定您的开发/部署平台是什么,但它们应该包含会话状态服务 - 启动它,更改您的 web.config,问题就解决了。

于 2009-02-05T19:28:21.873 回答
1

这是一个常见问题的聪明(和丑陋)解决方案

The main problem is the architecture of such system; the code that needs to be updated can be put on a different service outside his web app, his code behind can then call these services, and the services can be updated when needed without affecting the web app

于 2009-02-05T19:35:39.143 回答
1

Every base has been covered already, but I really hate bad practices like this. If the guy can't simply change to a state server to fix the problem that he has, then he doesn't really deserve the help. What would happen if he put his class in the root folder of the project and compiled it independently? Either way, I would think this guy is a bad developer for not thinking about scalability, and not planning for downtime. What I'm guessing is he doesn't have a development environment available. Tsk tsk tsk.

正如其他人所说,作为对您问题的回答,将代码放在用户控件中,并做好记录。

于 2009-02-05T20:08:00.170 回答