我们有一个在ASP.NET上运行的网站。我想运行一个每XX小时检查一次数据库表的服务,并在不满足某些条件的情况下执行操作(发送邮件)。
我们不能使用
我们需要在服务器中进行某种轮询,这非常关键 我们现在有点卡住了。我们有哪些替代方案?
答案 0 :(得分:2)
有一个技巧可以用来模拟使用ASP.NET Web服务的Windows服务。
它的要点如下:
在缓存中放置一个项目,其有效期等于您想要轮询数据库的频率。
添加从缓存中删除项目时触发的回调。在回调方法中,添加您的轮询代码以执行您想要执行的操作(调用访问数据库,发送邮件等)。
所以:在你的全球性asax中,像这样:
private const string DummyCacheItemKey = "pollingCacheKey";
protected void Application_Start(Object sender, EventArgs e)
{
RegisterCacheEntry();
}
private bool RegisterCacheEntry()
{
if( null != HttpContext.Current.Cache[ DummyCacheItemKey ] ) return false;
HttpContext.Current.Cache.Add( DummyCacheItemKey, "Test", null,
DateTime.MaxValue, TimeSpan.FromMinutes(1),
CacheItemPriority.Normal,
new CacheItemRemovedCallback( CacheItemRemovedCallback ) );
return true;
}
public void CacheItemRemovedCallback( string key,
object value, CacheItemRemovedReason reason)
{
Debug.WriteLine("Cache item callback: " + DateTime.Now.ToString() );
// Do the service works
DoWork();
ReregisterCacheItem();
}
虽然它不理想,但它符合您的限制。
可以在此处找到该技术的全部细节:http://www.codeproject.com/Articles/12117/Simulate-a-Windows-Service-using-ASP-NET-to-run-sc
答案 1 :(得分:2)
这里提到
Easy Background Tasks in ASP.NET
这里有一些来自该链接的片段
private static CacheItemRemovedCallback OnCacheRemove = null;
protected void Application_Start(object sender, EventArgs e)
{
AddTask("DoStuff", 60);
}
private void AddTask(string name, int seconds)
{
OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
HttpRuntime.Cache.Insert(name, seconds, null,
DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, OnCacheRemove);
}
public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
// do stuff here if it matches our taskname, like WebRequest
// re-add our task so it recurs
AddTask(k, Convert.ToInt32(v));
}
在我的测试中运作良好;对于所有>用户 - Jeff Atwood
,每60秒授予一次徽章,如发条