Деятельность в области доступ к базе данных внутри невыделенный сервер Windows


У нас есть сайт, который работает на ASP.NET я хотел бы запустить службу, которая проверяет таблицу базы данных каждые XX часов и делает действие ( отправляет почту), если некоторые условия не выполняются.

Мы не можем использовать

  1. служба Windows как размещенный сервер не является выделенным сервером. (У нас есть только панель управления)
  2. служба SQL для отправки почты, поскольку мы используем Access 2003 (mdb) в качестве нашей базы данных. Он находится в App_Data
  3. IIS также недоступен

Его очень важно, что нам нужен какой-то опрос на сервере.
Теперь мы вроде как застряли. Какие у нас есть альтернативы?

2 2

2 ответа:

Его упоминают здесь

Легкие фоновые задачи в 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 секунд, как часы для всех > пользователей - Джефф Этвуд

Есть трюк, который можно использовать для имитации службы windows, используя только ваш ASP.NET веб-сервис.

Суть его сводится к следующему:

Поместите элемент в кэш с периодом истечения, равным тому, как часто вы хотели бы опрашивать свою базу данных.

Добавьте обратный вызов, который запускается при удалении элемента из кэша. В методе обратного вызова добавьте свой опросный код, чтобы сделать то, что вы хотите сделать (вызвать базу данных access, отправить почту и т. д.)

Итак: в вашем глобальный 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