web-dev-qa-db-ja.com

Asp.netMVCで24時間ごとにメソッドを実行する方法

私はMVCのようなメソッドを持っています

 public void Sendmails()
 {
     //sending mails for every 24 hours.
 }

上記のメソッドを24時間ごとに実行するようにスケジュールできますか? SQLServerエージェントとWindowsタスクスケジューラを使用してスケジュールを設定できることはわかっています。しかし、いくつかの問題のために、現在のdllのみを実行したいのですが、これはMVCで可能ですか?

8
Developer

可能?おそらく、タスクとバックグラウンドスレッドの呼び出しを少しハッキングしてください。 信頼できますか?少しもありません。

Webアプリケーションは、本質的には要求/応答システムです。アプリケーションは要求を受信し、そのロジックを実行して、応答を返します。それを超えて、それはアイドルです。そして、Webサーバーがそのメモリを使用または解放したい場合、メモリから完全にアンロードされるのはWebサーバーに翻弄されます。

ユーザーの操作なしで(つまり、開始の要求なしで)定期的に何かを実行するには、Webアプリケーションは必要なものではありません。代わりに、ホストシステムのスケジューリングソフトウェア(Windowsタスクスケジューラ、cronなど)によって定期的に実行されるようにスケジュールされたWindowsサービスまたは単純なコンソールアプリケーションのいずれかを探しています。

もちろん、これらのアプリケーションはコードを簡単に共有できます。それらは同じソリューションにあり、同じクラスライブラリへの参照を持つことができます。実際、コードのアプリケーション層は常に可能な限り薄く軽量である必要があり、意味のあるコードはすべて共有ビジネスロジックアセンブリに含まれている必要があります。そうすれば、どのアプリケーション(Webアプリケーション、Windowsサービス、コンソールアプリケーションなど)でも、これらの共有アセンブリを参照して、同じロジックを呼び出すことができます。

さらに、実行中の複数のアプリケーションで同じデータを簡単に共有することもできます。それらは両方とも(もちろん共有データアクセスロジックを使用して)同じデータベースに接続でき、それ以外の場合は本質的に同一別々のアプリケーションインスタンスによって呼び出される集中型ロジックの表現です。

17
David

誰もが言ったように、信頼性などのために.netWebアプリケーションで長時間実行されるバックグラウンドプロセスを実行することは良い習慣ではありません。

24時間ごとにMVCアクションメソッドを呼び出す外部トリガーを作成できます。したがって、24時間ごとにコードを実行しています。それを行うには複数の方法とサービスがありますが、私はさまざまなサービスを使用しました。または、サードパーティを使用したくない場合は、独自に作成することもできます。

たとえば、pingdom.comの無料アカウントを使用して、<enter time here>期間ごとに特定のURLを呼び出すことができます。したがって、pingdomでは、MVCアクションのURLを入力できます。

http://domain/controller/action

そして、それは24時間ごとに呼び出され、コードはスケジュールどおりに実行されます。

更新:最近、このようなシナリオ用に構築されたAzureスケジューラーを使用しています。 https://Azure.Microsoft.com/en-us/services/scheduler/

6
MoXplod
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace Proposal_Sln
{
public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Interval = 1000;
        timer.Elapsed+=timer_Elapsed;
        timer.Start();
    }

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Models.Proposal_DBEntities DB = new Models.Proposal_DBEntities();
        Models.tbl_Year Y = new Models.tbl_Year();
        Y.YearName = "13" + DateTime.Now.Second.ToString();
        DB.tbl_Year.Add(Y);
        DB.SaveChanges();
    }
 }
}

その仕事は良い

5

これは Revalee の優れたユースケースのように聞こえます。 Revaleeは、この種の状況に対処するために開発されたオープンソースプロジェクトです。 Windowsサービスを使用してタスクの永続性とスケジューリングを管理しますが、Webアプリケーションを利用して処理作業を処理します。あなたの場合、あなたはあなたのSendEmailアクションがサービスを通して24時間ごとに1回呼び出されるようにスケジュールするでしょう。

以下は、Revaleeを使用するWebアプリケーションのワークフローです。

Revalee Workflow
(出典: sageanalytic.com

免責事項: 私はRevaleeプロジェクトに関わった開発者の一人でした。ただし、明確にするために、Revaleeは無料のオープンソースソフトウェアです。ソースコードは GitHub で入手できます。

4
László Koller

@Davidに同意します。ウェブアプリケーションでバックグラウンドタスクを実行することは本質的に信頼性がありませんが、これが理にかなっているシナリオがあります。最初にこの優れた記事を読むことをお勧めします http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net。 aspx /

.NET 4.5.2では、この記事をうまく説明しているように、HostingEnvironmentを活用できます。 http://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp- net-application-in-net-4-5-2 それから引用すると、「HostingEnvironment.QueueBackgroundWorkItemメソッドを使用すると、小さなバックグラウンド作業項目をスケジュールできます。ASP.NETはこれらの項目を追跡し、IISがすべてのバックグラウンド作業項目が完了するまで、ワーカープロセスを突然終了します。」

しかし、繰り返しになりますが、これは良い習慣ではありません。使用する場合は、かなり賢明に使用する必要があります。

1
Robert Goldwein

これは、Windowsサービスから電子メールを送信するための簡単なチュートリアルです。同じデータベースを使用できます...など。 http://www.codeproject.com/Tips/704008/Send-Auto-Notification-Using-Windows-Service

0
Stefdelec