有多种方法可以处理您的要求,以及问题的几个不同方面:
处理促销的小更新
您真正想要的是一个内容管理系统或类似的系统,它使您可以即时编辑内容(想想Wordpress / Drupal或从.NET的角度来看N2 CMS,Umbraco,Orchard等),但是如果您没有沿那条路走,可以尝试一些方法。
因为ASP.NET仅在您触摸某些类型的文件时才真正重新加载(web.config(s),而/bin/
and /app_code/
文件夹的内容大部分)-并且对“其他文件更改”具有可配置的限制(基本上,一旦您进行了修改,您网站中的许多文件会重新启动应用程序池- NumRecompilesBeforeAppRestart
)您可以考虑做一些事情,在其他文件夹中检查一些静态(即.html
)文件,以根据需要提取并显示这些文件,或者利用LoadControl
采用字符串路径的方法一个.ascx
用户控制和动态加载它-你如何决定要展现的是一个不同的问题StackOverflow上更适合-但是我建议一个基于命名约定的解决方案。
您还可以考虑使用类似Managed Extensibility Framework(MEF-从版本4开始就已是.NET框架的完整部分)之类的东西,它允许您编写基于插件的体系结构并在目录外部指定文件夹/bin/
以进行监视新的.DLL-尽管我没有尝试过查看它是否可以避免应用重新启动的问题,但是我已经在网络环境中使用了此功能,以便为网站添加通用功能。
如果那没有吸引力,我能想到的唯一其他选择是像在经典ASP中一样,将控件添加为“在前面的代码”-即使用<script runat="server">
块而不是编译的“代码在后”类包含运行控制逻辑-这将删除一个DLL变革的需要,在一些第一次性能损失为代价的控制被编译的飞行-再次,你需要用平衡这个NumRecompilesBeforeAppRestart
,如果你正在做很多小的更改。
如何在应用重新启动期间保持会话?
这可能是一个较容易解决的问题,涉及三个关键步骤:
- 将MachineKey(IIS7,但仍然保持8)配置为恒定值,而不是
AutoGenerate
-这意味着当AppPool回收时,它将使用相同的密钥,因此能够从之前解密会话cookie,viewstate等。回收。
- 无论是设置一个状态服务器或配置一个数据库来保存会话状态。
- 在web.config中从使用或切换
InProc
到SessionState元素。StateServer
SQLServer
这样,您将拥有持久的会话,这些会话可以在应用程序重启后继续存在。但是,这些并不是“免费的”-您存储在会话中的所有内容现在都必须可序列化,并且由于每个页面加载现在都需要更多的网络行程才能获得,并可能释放会话数据,因此您的性能会受到轻微影响。
但是,如果您处于部署后需要花费“几分钟”才能重新启动应用程序的位置,则可能需要考虑迁移到负载平衡的环境,或者至少考虑使用热插拔的暂存/实时设置。 (例如Azure / AWS / etc.net提供的服务)-这样,您可以在更新服务器时使服务器脱机或使用新代码使其准备就绪,然后将其换入-如果您已采取解决共享地址的步骤会话(请参见上文),这将正常工作,并且不会影响您的用户。