Pull to refresh

Сервис без сервиса для asp.net приложения

Reading time2 min
Views490
Иногда бывает нужно, чтобы рядом с asp.net приложением работал сервис, который бы расслылал почту или просто делал какие-то операции через определенные промежутки времени. Это можно сделать с помощью windows service, но не все хостинги позволяют их устанавливать и их не очень удобно отлаживать (на мой вкус). Я нашел в сети интересный способ обойтись без сервиса и хочу им поделиться. Возможно, это всем известная штука, но в поиске я про это ничего не нашел.



Идея заключается в том, чтобы при старте приложения положить в кеш некий объект, а при его «смерти» повторить процедуру снова. Делаем это в global.asax Упрощенно, код будет выглядеть так:
protected void Application_Start(object sender, EventArgs e)
{

HttpContext.Current.Cache.Add("ServiceCacheKey", "Dummy", null, DateTime.MaxValue, TimeSpan.FromMinutes(1), CacheItemPriority.Normal, new CacheItemRemovedCallback(CacheItemRemovedCallback));

}


Теперь в самом CacheItemRemovedCallbak можно сделать нужные «сервисные» действия и запустить процесс помещения объекта в кеш. Так как в этот момент HttpContext не доступен, мы будем вызывать какую-нибудь страничку, а в момент вызова этой странички класть объект в кеш.

public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)
{

//do service work

WebClient wc = new WebClient();
wc.DownloadData(SecretPageURL);
}

protected void Application_BeginRequest(object sender, EventArgs e)
{
if ((HttpContext.Current.Request.Url.OriginalString == SiteSettings.ServiceCacheKeyURL) && (HttpContext.Current.Request.IsLocal == true))
{
HttpContext.Current.Cache.Add("ServiceCacheKey", "Dummy", null, DateTime.MaxValue, TimeSpan.FromMinutes(1), CacheItemPriority.Normal, new CacheItemRemovedCallback(CacheItemRemovedCallback));
}
}


Вот и все. Единственное, что меня смущает, так это то, что теперь на каждый запрос будет происходить проверка на то, вызвалась ли нужная страничка и нужно ли класть «сервисный» объект в кеш — не знаю, как это повлияет на производительность.
Tags:
Hubs:
Total votes 5: ↑3 and ↓2+1
Comments14

Articles