*[hatefu:labs.yaneu.com/20090722/] ASP.NETではcronに相当する処理はどうするのか


Webプログラムでは、一定期間ごとにタスクを起動してDBを掃除したいということがある。
LAMPでは、普通cronを使うが、ASP.NETでは、どうすればいいのだろう?


* IISにcronに相当する機能はあるのか?


IIS用のcronが市販されていたりするぐらいなので、IISにこのような機能は存在しない。

# IIS用のcron
IIS cron
http://www.iiscron.com/

正攻法(?)としては、次のような方法がある。

# 参考記事
ASP.NETでWindowsサービスのような機能を実装する方法
http://codezine.jp/article/detail/1148

また、cygwinをインストールしてcronを使って、定期的にwgetで特定のaspxを表示させて、それをトリガーにDBの掃除を行なう方法もある。タイムアウトの設定に注意するなら、この方法は悪くはない方法だろう。

しかしこの程度の機能は、IISのUI上で、定期的に実行するaspxファイルを指定できても良さそうなものだが、そんな気の利いた機能はIISには用意されていない。(少なくとも現在最新のIIS7でも)

DBの掃除なら、SQL Serverには定期実行するjobを設定する機能があるが、もっとお手軽にASP.NET用のコードをコピペしてきてLINQで記述したいのである。


* タスクスケジューラによる定期実行


では、タスクスケジューラでやってみてはどうだろうか。

この場合、C#でコンソールアプリを作成し、そのなかでASP.NET用のプロジェクトを参照する。

このときの利点は
** ASP.NETのプロジェクト用に書いていたクラスを利用することが出来る。(例えば、自前のログ出力用メソッドなど)
** LINQで書くことが出来る
** タスクスケジューラなので使い慣れた(?)UI上でスケジュールを設定することが出来る
などである。


* 具体的な手順


** Visual StudioでC#用のコンソールアプリのプロジェクトを作成
** 参照設定で、ASP.NETのプロジェクトを参照

このとき、コンソールアプリをコンパイルしたバイナリ(exe)から、ASP.NETのプロジェクト(「Webプロジェクト」)のdllを実行時に参照することになる。

DBへのアクセスは、dllのほうから行なっており、このときの接続文字列は、XXXX.dll.configに書けばいいかのように思えるが、XXXX.dll.configは実際には使われることはない。これは、.NETの設計上のミスとも思えるが、ともかくそうなっているものは仕方がない。

# 参考記事
DLLのapp.configについて - Insider.NET - @IT
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38151&forum=7

** そこで、このコンソールアプリのApp.Configに接続文字列を記述してやる。ASP.NETのプロジェクトのWeb.configの接続文字列の部分をコピペしてくれば良い。

App.Configは、ビルド時に、XXXX.exe.configへとコピーされる。よって、XXXX.exe.configのほうにいくら書いておいても、ビルド時にApp.Configからコピーされて何故意図通りに動かないのかとあなたは悩むことになるので注意!

>>
  <connectionStrings>
    <add connectionString="Data Source=XXXXXXX;User ID=xxxxxxxx;Password=XXXXXXXXXX;Initial Catalog=YaneWebSDK_Database" name="ConnectionString" providerName="System.Data.SqlClient" />
  // (中略)
  </connectionStrings>
<<

** ここまで来れば、あとはタスクスケジューラのほうで、この実行ファイルを定期的に実行するように設定するだけだ。

* まとめ

定期的にjobを実行したいというのはFAQに属すると思うのだが、ASP.NETにおいてはそのAnswerは意外と知られていない。(もちろん、ここに書いた方法が唯一のAnswerでもない。)

個人的には、Windows Serverは商用サーバーなのだからこういう基本機能をもっと充実させておいて欲しい気もするのだが…。

* 追記

トラックバックいただいて、それがとても参考になったのでご紹介。

# Re: ASP.NETではcronに相当する処理はどうするのか
猫とC#について書くmatarilloの日記
http://d.hatena.ne.jp/matarillo/20090723/p1

私は、まわりにASP.NETをやって開発している人が居ないので、何が「普通」なのかはよくわからないんですよね…(´ω`)

* 更新履歴

2009.07.23 追記
2009.07.22 公開