2011-10-18 13 views
1

ビルド中のWebアプリケーションのバックグラウンドタスクを実行する必要があります。私はを使用してサーバー上でサービスを実行する様子が気に入っています。私はサービスを初期化する最善の方法を考えていました。MVC WebアプリケーションでTopShelfを実行しています

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     InitService(); 
    } 

    private void InitService() 
    { 
     Task.Factory.StartNew(() => HostFactory.Run(x => 
                 { 
                  x.Service<TestService>(s => 
                         { 
                          s.SetServiceName("TestService"); 
                          s.ConstructUsing(
                           name => new TestService()); 
                          s.WhenStarted(ts => ts.Start());                        s.WhenStopped(ts => ts.Stop()); 
                         }); 
                  x.RunAsLocalSystem(); 
                  x.SetDescription("Sample test service"); 
                  x.SetDisplayName("Test display name"); 
                  x.SetServiceName("Test service name"); 
                 })); 
    } 

は明らかにアプリケーションを起動するジョブは、自身のタスクで実行されます。たとえば

を起動MVCアプリケーションからサービスを開始するには悪い考えだろうかと思いまして。 これを行うより良い方法はありますか?これに問題がありますか?

私の考えは、サービスが開始されると、それ以降は自分自身を処理するということです。

あなたのWebアプリケーションを何度も再起動しても、サービスが既に実行されていれば別のものを起動しないでください

答えて

2

これを行うことができますが、これは(IIS内部で管理)Webアプリケーションのスコープでサービスがライブになり - あなたは本当に窓としてインストールされていませんサービス。つまり、アプリケーションプールが削除された場合、サービスも削除されます。

サービスをWindowsサービスとしてインストールする場合は、そのサービスが存在するかどうかを確認し、コンソールアプリケーション内で「servicename install start」を実行する必要があります。それは本当にあなたが望むものに依存します。それをアプリの一部にすると何かが得られるかもしれませんが、複数のマシンでアプリを実行する必要がある場合は、扱いにくいかもしれません。

個人的には、私は常にIIS内のWebアプリケーションのスコープではなく、別のサービスとして実行するようにします。

2

あなたはこの作品、あまりにも任意の心配なしQuartz

+0

+1最後に、私はこのアプローチのために最終的に行きました。ありがとうございました。 – Mike

関連する問題