Деятельность в области доступ к базе данных внутри невыделенный сервер Windows
У нас есть сайт, который работает на ASP.NET я хотел бы запустить службу, которая проверяет таблицу базы данных каждые XX часов и делает действие ( отправляет почту), если некоторые условия не выполняются.
Мы не можем использовать
- служба Windows как размещенный сервер не является выделенным сервером. (У нас есть только панель управления)
- служба SQL для отправки почты, поскольку мы используем Access 2003 (mdb) в качестве нашей базы данных. Он находится в App_Data
- IIS также недоступен
Его очень важно, что нам нужен какой-то опрос на сервере.
Теперь мы вроде как застряли. Какие у нас есть альтернативы?
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