17

1 日に 1 回、複数のサーバーで実行されている ASP.NET MVC4 Web サイトから、レポートを電子メールで送信してもらいたいと考えています。これはかなり一般的なことのように思えますが、私はそれを行うための良い方法を考え出すのに苦労しています.

この作業を行うためにサーバーでタイマーを実行しようとすると、いくつかの理由で問題が発生します。複数のサーバーがある場合は、すべてのサーバーでタイマーを実行します (サーバーがダウンした場合)。それらの間で調整する必要があり、複雑になります。また、バックグラウンド スレッドから Entity Framework 経由でデータベースにアクセスしようとすると、定期的なバックグラウンド スレッドと "フォアグラウンド" コントローラー スレッドの間で DbContext オブジェクトの構築/破棄をシリアル化するためにロック戦略を採用する必要があるという複雑さが加わります。

もう 1 つのオプションは、サーバーでタイマーを実行することですが、タイマー スレッドに、レポートを生成して電子メールで送信する魔法のページへの GET を実行させることです。これにより、データベース アクセスが通常の Controller アクションで発生し、データベースへの他のすべての Controller アクセスでシリアル化されるため、DbContext の問題が解決されます。しかし、複数のタイマーが実行されている可能性があるという問題にまだ悩まされているため、冗長なレポート要求を無視するには、コントローラー アクションにスマートが必要です。

助言がありますか?この種のことは通常どのように行われますか?

4

4 に答える 4

14

Phil Haack が でうまく説明しているように、Web アプリケーションからこのタスクを実行するべきではありませんhis blog post

この種のことは通常どのように行われますか?

このタスクは、Windows サービスから実行することも、Windows スケジューラを使用して定期的に実行するようにスケジュールされたコンソール アプリケーションから実行することもできます。

于 2013-04-07T08:57:58.023 に答える
3

適切な解決策は、Web サイトとは独立して実行されるバックグラウンド サービスを作成することです。ただし、それができない場合は、 Jeff Atwood によるASP.NET の Easy Background Tasks で説明されているように、キャッシュを使用できるハックがあります。

于 2013-04-07T09:01:52.343 に答える
2

いくつかのオプション:

  • Web サイトとして Azure でホストしている場合は、最近プレビューでリリースされた Web ジョブを確認してください ( http://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/ ) 。
  • Web サイトの外で電子メール ロジックを抽出する手間をかけたくない場合は、(ハンドラー、mvc アクションなどを使用して) URL でその機能を公開し、スケジュールに従ってその URL にヒットする Windows スケジュール タスクを実行します。 .
  • Windows のスケジュールされたタスクを介して同様に実行される単純なコンソール アプリを作成します。
  • または、内部的にループして時間をチェックし、到達したときにその URL にヒットし、その exe を実行するか、または電子メールを送信する独自​​のコードを持つ単純な Windows サービスを記述します。
于 2014-07-02T01:32:25.803 に答える