2011-12-29 27 views
3

共有環境でGoDaddy上でASP .NET Webサイトを実行しています。このアプリケーションは定期購読ベースのサービスで、定期的に課金するオプションがあります。ASP .NETの繰り返しタスク

毎時、アカウントをアップグレードまたはキャンセルしたユーザーを更新するために、ユーザーデータをGoogleの支払いプロセッサと同期させる必要があります。支払い処理担当者には、URLを呼び出したり、変更を通知する仕組みがありません。

問題:事前定義された間隔でいくつかのコードを実行するバックグラウンドスレッドを作成する必要があります。 .NETのバックグラウンドタスクについてのいくつかの良い記事がありますが、私は確信しています。これについてはもっと簡単な方法があります。たぶんなどの関数を呼び出すことができ、アプリケーション全体のタイマー、

制限:共有環境を許可しませんが、Windowsのサービスなどの外部アプリケーション、完全信頼、

これは本番アプリケーションなので、I腕をねじるよりも安全なアプローチを可能にしたいと考えています。

+0

チェックをこの1:のhttp://のstackoverflow。com/questions/1356789/quartz-net-with-asp-net –

+0

はい、私はQuartzを知っています。私は外部のライセンス、商用またはオープンソースに依存せずにカスタムソリューションを探しています。 –

+0

プロバイダからデータをどのように取得しますか?あなたは「URLを呼び出すための仕組みがない」と言った。彼らはあなたに電話することができない、あるいは電話することができない、あるいはその両方をすることができないと言っていますか? –

答えて

5

私は同様の問題を抱えていました。私は概念のASP証明を開発しており、数時間かかるタスクを実行するバックグラウンドスレッドを使用しています。問題は、ASP.NetはAppDomainをいつでもリサイクルできることです(バックグラウンドスレッドを強制終了)。

これを防ぐには、バックグラウンドスレッドをASP.Netに登録して、スレッドをシャットダウンするように通知します。これを行うには、次のインタフェースを実装しています

public interface IRegisteredObject 
{ 
    void Stop(bool immediate); 
} 

をそして次の静的メソッドを使用してASPにあなたのオブジェクトを登録:ASP.NETがAppDomainのを切断すると

HostingEnvironment.RegisterObject(this); 

、それは最初のピットストップをコールしようとしますメソッドを呼び出すことができます。ほとんどの場合、このメソッドは2回呼び出されます.1回は即時falseに設定されます。これは、あなたのコードが何をしているのかを完了するために少し時間を与えます。 ASP.NETでは、IRegisteredObjectのすべてのインスタンスに30秒間ではなく、作業を完了するための合計30秒が与えられます。その時間が経過した後に、登録されたオブジェクトが残っていると、直ちにtrueに設定されて再び呼び出されます。

作業者がビジー状態のときにフィールドをロックすることによってStopメソッドが返されないようにすることで、作業が終了するまでASPがAppDomainのシャットダウンを停止します。

public void Stop(bool immediate) 
{ 
    lock (_lock) 
    { 
     _shuttingDown = true; 
    } 
    HostingEnvironment.UnregisterObject(this); 
} 

public void DoWork(Action work) 
{ 
    lock (_lock) 
    { 
     if (_shuttingDown) 
     { 
      return; 
     } 
     work(); 
    } 
} 

キャンセルのオプションを有効にするには、アクションの代わりにタスクを使用します。特定のケースでは、このようなタスクを実行するタイマーを起動することができます。

PS。これはハックで、ASPはバックグラウンドタスクを実行するものではありませんので、可能であればWindowsサービスまたはWCFサービスを使用してください!これは、開発、メンテナンス、およびインストールを簡素化するので、私はこれを使用します。

詳細については、私のソースを参照してください。http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

+0

1年遅れますが、私は解決策が好きで、現在のプロジェクトでそれを試してみます。ありがとう。 –

+0

どのように動いたか教えてください! – Rob

0

答えがなかったので、他の人に役立つように私の解決策を投稿すると思った。

しかし、理想的なアプローチではなく、それを得ることができる人にとっては、必要なASP .NET URLと呼ぶ別のLinuxホスティングアカウントでcronジョブを作成しました。管理恐怖が、仕事をします。

関連する問題