csharp - 云代码空间
——
我希望在用户修改了配置文件后,程序能立刻以最新的参数运行,而且不用重启网站。
今天我就来回答这个问题,并给出所需的全部实现代码。
首先,我要说明一点:上次博客的问题,虽然解决方案与Cache的文件依赖有关,但还需与缓存的移除通知配合使用才能完美的解决问题。 为了便于内容的安排,我先使用Cache的文件依赖来简单的实现一个粗糙的版本,在本文的后续部分再来完善这个实现。
先来看个粗糙的版本。假如我的网站中有这样一个配置参数类型:
/// <summary> /// 模拟网站所需的运行参数 /// </summary> public class RunOptions { public string WebSiteUrl; public string UserName; }
我可以将它配置在这样一个XML文件中:
<?xml version="1.0" encoding="utf-8"?> <RunOptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <WebSiteUrl>http://www.cnblogs.com/fish-li</WebSiteUrl> <UserName>fish li</UserName> </RunOptions>
再来一个用于显示运行参数的页面:
<body> <p>WebSiteUrl: <%= WebSiteApp.RunOptions.WebSiteUrl %></p> <p>UserName: <%= WebSiteApp.RunOptions.UserName %></p> </body>
下面的代码就可以实现:在XML修改后,浏览页面就能立即看到最新的参数值:
public static class WebSiteApp { private static readonly string RunOptionsCacheKey = Guid.NewGuid().ToString(); public static RunOptions RunOptions { get { // 首先尝试从缓存中获取运行参数 RunOptions options = HttpRuntime.Cache[RunOptionsCacheKey] as RunOptions; if( options == null ) { // 缓存中没有,则从文件中加载 string path = HttpContext.Current.Server.MapPath("~/App_Data/RunOptions.xml"); options = RwConfigDemo.XmlHelper.XmlDeserializeFromFile<RunOptions>(path, Encoding.UTF8); // 把从文件中读到的结果放入缓存,并设置与文件的依赖关系。 CacheDependency dep = new CacheDependency(path); // 如果您的参数较复杂,与多个文件相关,那么也可以使用下面的方式,传递多个文件路径。 //CacheDependency dep = new CacheDependency(new string[] { path }); HttpRuntime.Cache.Insert(RunOptionsCacheKey, options, dep); } return options; } } }
注意:这里仍然是在使用CacheDependency,只是我们现在是给它的构造函数的第一个参数传递要依赖的文件名。
在即将结束对缓存的依赖介绍之前,还要补充二点:
1. CacheDependency还支持【嵌套】,即:CacheDependency的构造函数中支持传入其它的CacheDependency实例,这样可以构成一种非常复杂的树状依赖关系。
2. 缓存依赖的对象还可以是SQL SERVER,具体可参考SqlCacheDependency