2009-04-23 15 views
6

特定の時間に通知(電子メール)を受信するスケジューラが必要なWebサイトがあります。例えば。午後5時に午後4時45分に会議に出席するためにリマインダーを設定した人は、午後4時45分に同じメールを受信します。asp.netのジョブスケジューラが必要

このサイトは共有サーバーでホストされているため、SQLジョブまたはスケジューラーアプリケーションを実行するサーバーを制御することはできません。

このシナリオで役立つasp.netには何かがありますか?

答えて

9

どうすればいいですか:Simulate a Windows Service using ASP.NET to run scheduled jobs

このテクニックはused on Stack Overflowでしたが、もうこれ以上はないと思います。

正直言って、それは厄介でエラーが起きやすいハックのようですが、あなたのウェブサイト以外のサーバーで何も実行できない場合は、おそらくこのオプションが唯一のオプションです。

+0

100%はその方法の分析に同意します。しかし、制限があることを理解している限り(IE:「スケジュールされた」ジョブはスケジュールされた時点で正確に実行されない可能性があります)、それは良い解決策です。 – NotMe

2

ASP.NETでは、あなたのアプリが常に生きているという保証はなく、スケジューリングソリューションのホストプロセスとしてのWebアプリケーションは実行可能ではありません。

このシナリオでは、Windowsサービスが必要です。プロセスの開始と停止、およびアプリケーションの監視方法を完全に制御できます。

このようなサービスを別のマシンでホストすることはできますか? Webアプリケーションがホストされたサーバー上で実行されていても、同じサーバー上でスケジューラーを実行する必要はありません。

+0

また、Windowsサービスでは、ホストされているサイトのWebサービスを呼び出してタスクを開始することができるため、作業がさらに簡単になります。 –

1

実際にサーバーを制御できない場合(つまり、SQLジョブ、スケジュールされたタスク、またはWindowsサーバーをインストールすることはできません)、Global.asaxで初期化するSystem.Threading.Timerを使用できますアプリケーションの特定のメソッドをx分ごとに呼び出します)。このメソッドは、データベースにクエリを行い、送信する必要がある通知を確認します。

これは本当に望ましいアプローチではありませんが、タイマーはいつも私が知る限り呼び出すことが保証されていないため、Peterが言っているようにWebアプリケーションは常に生きているとは限りません。

ただし、要件に応じて、他に選択肢がない場合でも「十分な」アプローチとなります。

1

しかし、あなたが本当にあなたのGlobal.asax.csファイルでSystem.Timers.Timerインスタンスを作成する時に見ることができる完全に立ち往生しているウェブアプリケーションでそれをホストするしかない、

場合。ワイヤーアップElapsedイベントを通常どおり、それに

protected void myTimer_Elapsed(object sender, EventArgs e) 
{ 
    if(System.DateTime.Now Falls in Some Configured Time-Window) 
     //Do Stuff 
} 

の線に沿って何かを誰かが指摘するようにIISがその期間中にリセットされるかもしれないとして、その保証はないいくつかのコードを与えるなど、 であなたがそれを逃すケース。

0

これは本当に望ましいことではありませんが、あなたはRazzieが示唆していることを行うことができます。私はそれが何度もやったのを見ました。醜いですが、時にはちょうど醜いハックをする必要があります。

この方法を使用すると、アプリケーションがアンロードされていないことを確認する必要があります。だからあなたは何らかの生き方を必要としている。私はアプリケーションを生かし続けるために、常にページ(aspx)を引っ張るWeb監視ツールを設定することをお勧めします。これらの人は無料ですhttp://mon.itor.us/

+1

@Arjan Einbuが示唆していることをする方が良いと思います。 http://mon.itor.usのようなものは、必要な外部ページ要​​求を設定する非常に簡単な方法のように見えます。 – codeape

+0

その後、他のマシンが動いていて、それを覚えておかなければならないあなたのアプリに依存しています;)私は忘れてしまったり、アップデートなどでマシンが再起動してしまいます。醜いハック;) –

4

あなたはサーバーで仕事をする必要がありますが、あなたはASP.NETからそれをトリガする良い方法がありませんか?

あなたの仕事を開始するウェブページを作成し、そのページをリクエストする別の場所(つまり別のコンピュータ上)でタイマーを実行させることはどうですか?

+1

+1これは、これを達成するための最も簡単で、最も信頼できる方法です。 – codeape

+0

シンプル、はい。しかし、信頼できる? –

+1

@ joel mueller:はい、どうしてですか? –

3

私はあなたと同じ問題を抱えていました。私は、Quartz.NETを利用するプログラミングサービスで終わりました。http://quartznet.sourceforge.net/そしてウェブサイトと同じデータベースに接続してください。

-1

Quartz.Net(1.0と1.0.1)のソースコードはVisual Studio.Net 2005と2008の下でコンパイルされないので、私は信じません。Quartz.Netを入手する唯一の方法は、 VS.Net 2005および2008の下で細かくコンパイルするSpring.Netパッケージ

いくつかのヒントを共有できない限り、asp.netプロジェクトでquartz.dllをコンパイルして使用する方法がない限り! (Quartz.Netとreadme.txtのWebページはソースcoudeコンパイルに関する情報を提供していません)あらゆるヒントが歓迎されています!

0

ソース Quartz.Netのコード(1.0および1.0.1) は、Visual Studio.Net 2005年と2008年クォーツを取得する唯一の方法 の下でコンパイルされませんので、私は、あなたを信じていませんあなたは、いくつかのヒントを共有することができる方法 コンパイルし asp.netプロジェクトにquartz.dllを使用しない限り、.NETは VS.Net 2005下の罰金と2008

をコンパイル全体 Spring.Netパッケージを、使用することです! (ウェブページ Quartz.Netとreadme.txtは ソースに関する情報を提供していません coudeコンパイル)すべてのヒントは です。

最初は問題がありましたが、これは必要なAsemblyInfo.csが親フォルダに含まれているためです。また、含まれている3つのDLLを追加する必要があります。

関連する問題