3

特定の間隔でユーザーに通知メールを送信するために、asp.netで割り当てに取り組んでいます。

しかし、問題は、サーバーが個人所有ではないため、Windowsサービスを実装できないことです。

何か案は?

4

5 に答える 5

5

それを達成するための信頼できる方法はありません。ホストにWindowsサービスをインストールできない場合は、電子メールを送信するエンドポイント(.aspxまたは.ashx)を作成し、他のサイトでHTTP要求を送信してこのエンドポイントに定期的にpingを送信するサービスを購入できます。明らかに、サービスを購入したプロバイダーのIPアドレスからのみアクセスできるようにこのエンドポイントを構成する必要があります。そうしないと、だれでもエンドポイントにHTTP要求を送信して、おそらく望ましくないプロセスをトリガーする可能性があります。

さらに読む:The Dangers of Implementing Recurring Background Tasks In ASP.NET

于 2012-10-17T13:09:28.197 に答える
2

Windowsサービスを必要としない間隔でコードを実行する方法はいくつかあります。

1つのオプションは、Cacheクラスを使用することです-Insert取るオーバーロードの1つを使用しますCacheItemRemovedCallback-これは、キャッシュアイテムが削除されたときに呼び出されます。このコールバックを使用して、キャッシュアイテムを何度も再度追加できます...

ただし、最初に行う必要があるのは、ホスティング会社に連絡して、ホスティング会社がすでに何らかの解決策を持っているかどうかを確認することです。

于 2012-10-17T13:11:58.643 に答える
0

いつでもを使用して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

より多くの言葉

私はこれをより複雑なクラスで使用し、うまく機能します。私も指摘したことは何ですか。

  • アプリケーションの停止を通知し、タイマーが終了するのを待ちます。
  • 作業を同期するためにミューテックスとデータベースを使用してください。
于 2012-10-17T13:21:32.080 に答える
0

最も簡単な解決策は、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");
于 2012-10-17T13:21:42.540 に答える
0

サーバー上にスケジュールされたタスクを設定して、目的のアクションでプログラムを呼び出すことができます。

于 2012-10-17T13:10:35.430 に答える