保持 Web 服务对象的会话状态






2.60/5 (2投票s)
保持 Web 服务运行,不依赖用户
引言
此服务使一个 Web 服务实例保持活跃很长时间。
背景
我最近在 CodeProject 上找到了一篇文章,解释了如何使用缓存过期事件“模拟 Windows 服务”。 你可以在 这里 阅读它。 然后我想到利用它来使我的 Web 服务在没有用户的情况下保持活跃很长时间。
使用代码
你应该按照 文章 中描述的方式创建页面访问模式,并在你的 Web 服务中实现单例模式。 文章中描述的代码模拟了一个每分钟访问页面的计时器。 就像你可以在第一次访问网页时创建你的 Web 服务实例,然后每次后续访问都会返回你的实例,并保持你的 Web 服务活跃一样。 因此,这意味着你可以在你的服务中使用例如计时器或其他对象,而不必担心丢失它们的状态。
实现单例模式以确保你不会创建数千个实例。
static WebService instance = null; static readonly object singletonSync = new object(); public static WebService Instance { get { lock (singletonSync) { if (instance == null) { instance = new WebService(); } return instance; } } } // next code goes to global asax protected void Application_BeginRequest(Object sender, EventArgs e) { if (HttpContext.Current.Request.Url.ToString() == defaultUrl) { NewCacheEntry(); } } private void NewCacheEntry() { if (null != HttpContext.Current.Cache[newCacheItemKey]) { return; } HttpContext.Current.Cache.Add( newCacheItemKey, "value", null, DateTime.MaxValue, TimeSpan.FromMinutes(1), CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(CacheItemRemoved)); } public void CacheItemRemoved(string key, object value, CacheItemRemovedReason reason) { CliDownloadThePage(); } private void CliDownloadThePage() { System.Net.WebClient client = new System.Net.WebClient(); client.DownloadData(defaultUrl); }