2012-06-06 65 views
2

我們有一個運行在ASP.NET上的網站。我想運行一項服務,每隔XX小時檢查一次數據庫表,如果沒有滿足某些條件,請執行操作(發送郵件)。輪詢非專用Windows服務器內的訪問數據庫

爲託管服務器不是一個專用的服務器,我們不能用

  1. Windows服務。 (我們只有控制面板)
  2. 用於發送郵件的SQL服務,因爲我們使用的是Access 2003(mdb)作爲我們的數據庫。它駐留在程序App_Data
  3. IIS也不可用

它很重要的是我們需要在服務器某種輪詢。
我們現在有點卡住了。我們有什麼替代方案?

回答

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)); 
} 

作品以及一些片段我的測試;徽章每60秒頒發一次,就像所有用戶的發條一樣 - Jeff Atwood

2

有一個技巧可以用來模擬一個windows服務只使用你的ASP.NET web服務。

它的要點去如下:

廣場項目與到期期限等於你想多久輪詢數據庫緩存。

添加從緩存中刪除項目時觸發的回調。在回調方法,添加您的投票代碼,做你想要做的事(呼叫接入數據庫,發送郵件等)

這樣:在全局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

+0

感謝這個美好的回答。我更喜歡atwood,因爲它更流行 – naveen