轮询非专用Windows服务器内的访问数据库

时间:2012-06-06 10:47:04

标签: asp.net service windows-server-2008

我们有一个在ASP.NET上运行的网站。我想运行一个每XX小时检查一次数据库表的服务,并在不满足某些条件的情况下执行操作(发送邮件)。

我们不能使用

  1. 作为托管服务器的Windows服务不是专用服务器。 (我们只有控制面板)
  2. 用于发送邮件的SQL服务,因为我们使用Access 2003(mdb)作为我们的数据库。它位于App_Data
  3. IIS也不可用
  4. 我们需要在服务器中进行某种轮询,这非常关键 我们现在有点卡住了。我们有哪些替代方案?

2 个答案:

答案 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秒授予一次徽章,如发条