asp.netアプリケーションのサービスなしのサービス

場合によっては、サービスをasp.netアプリケーションの隣で動作させる必要があります。このアプリケーションは、メールを送信するか、一定の間隔でいくつかの操作を行うだけです。 これはWindowsサービスを使用して行うことができますが、すべてのホスティングプロバイダーがそれらをインストールできるわけではなく、デバッグにはあまり便利ではありません(私の好み)。 私はネット上でサービスなしで面白い方法を見つけたので、それを共有したいと思います。 おそらくこれはよく知られていることですが、検索でそれについて何も見つかりませんでした。







アイデアは、アプリケーションの起動時にオブジェクトをキャッシュに配置し、「デッド」になったときに手順を再度繰り返すことです。 global.asax Simplifiedで実行すると、コードは次のようになります。

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

}

}









以上です。 わずらわしいのは、正しいページが呼び出されたかどうか、および「サービス」オブジェクトをキャッシュに入れるかどうかを確認するためにすべてのリクエストがチェックされることです。これがパフォーマンスにどのように影響するかわかりません。



All Articles