特定の間隔でユーザーに通知メールを送信するために、asp.netで割り当てに取り組んでいます。
しかし、問題は、サーバーが個人所有ではないため、Windowsサービスを実装できないことです。
何か案は?
それを達成するための信頼できる方法はありません。ホストにWindowsサービスをインストールできない場合は、電子メールを送信するエンドポイント(.aspx
または.ashx
)を作成し、他のサイトでHTTP要求を送信してこのエンドポイントに定期的にpingを送信するサービスを購入できます。明らかに、サービスを購入したプロバイダーのIPアドレスからのみアクセスできるようにこのエンドポイントを構成する必要があります。そうしないと、だれでもエンドポイントにHTTP要求を送信して、おそらく望ましくないプロセスをトリガーする可能性があります。
さらに読む:The Dangers of Implementing Recurring Background Tasks In ASP.NET
。
いつでもを使用してSystem.Timer
、特定の間隔で通話を作成できます。注意する必要があるのは、これはアプリケーションの起動時などに1回実行する必要があるということですが、複数のプールがある場合は、実行回数が増える可能性があります。また、データベースにアクセスしてデータを読み取る必要があります。行動。
using System.Timers;
var oTimer = new Timer();
oTimer.Interval = 30000; // 30 second
oTimer.Elapsed += new ElapsedEventHandler(MyThreadFun);
oTimer.Start();
private static void MyThreadFun(object sender, ElapsedEventArgs e)
{
// inside here you read your query from the database
// get the next email that must be send,
// you send them, and mark them as send, log the errors and done.
}
システムタイマーを選択する理由:http: //msdn.microsoft.com/en-us/magazine/cc164015.aspx
私はこれをより複雑なクラスで使用し、うまく機能します。私も指摘したことは何ですか。
最も簡単な解決策は、global.asaxアプリケーションイベントを悪用することです
アプリケーションの起動イベントで、グローバルクラスの静的シングルトン変数にスレッド(またはタスク)を作成します。
スレッド/タスク/ワークアイテムには、「サービスのような」コードが含まれるwhile(true){...}という無限のループがあります。
また、Thread.Sleep(60000)をループに入れて、不要なCPUサイクルを消費しないようにすることもできます。
static void FakeService(object obj) {
while(true) {
try {
// - get a list of users to send emails to
// - check the current time and compare it to the interval to send a new email
// - send emails
// - update the last_email_sent time for the users
} catch (Exception ex) {
// - log any exceptions
// - choose to keep the loop (fake service) running or end it (return)
}
Thread.Sleep(60000); //run the code in this loop every ~60 seconds
}
}
編集あなたのタスクは多かれ少なかれ単純なタイマージョブであるため、アプリプールのリセットやその他のエラーによるACIDタイプの懸念は実際には当てはまりません。これは、タスクが再起動してデータの破損とともに追跡を続ける可能性があるためです。ただし、スレッドを使用して、ロジックを保持するaspxまたはashxへのリクエストを実行することもできます。
new WebClient().DownloadString("http://localhost/EmailJob.aspx");
サーバー上にスケジュールされたタスクを設定して、目的のアクションでプログラムを呼び出すことができます。