5

共有環境の GoDaddy で ASP .NET Web サイトを実行しています。このアプリケーションは、ユーザーへの定期請求のオプションを備えたサブスクリプション ベースのサービスです。

アカウントをアップグレードまたはキャンセルしたユーザーを更新するために、1 時間ごとにユーザー データを支払い処理業者と同期する必要があります。支払い処理業者には、URL を呼び出したり、変更を通知したりするメカニズムはありません。

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

制限: 共有環境では、Windows サービス、外部アプリケーション、完全信頼などは許可されません。

これは運用アプリケーションであるため、IIS を無茶苦茶に扱うのではなく、可能な限り安全な方法を使用したいと考えています。

4

3 に答える 3

6

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

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

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

次の静的メソッドを使用して、オブジェクトを ASP に登録します。

HostingEnvironment.RegisterObject(this);

ASP.NET が AppDomain を破棄すると、最初にすべての登録済みオブジェクトで Stop メソッドの呼び出しが試行されます。ほとんどの場合、このメソッドは 2 回呼び出され、1 回は immediate が false に設定されます。これにより、コードが行っていることを完了するための少しの時間が与えられます。ASP.NET では、IRegisteredObject のすべてのインスタンスが作業を完了するために、それぞれ 30 秒ではなく、合計 30 秒かかります。その期間の後、登録済みのオブジェクトが残っている場合は、immediate を 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

于 2013-06-13T12:52:31.467 に答える
0

答えがなかったので、他の人に役立つ場合に備えて私の解決策を投稿すると思いました.

決して理想的なアプローチではありませんが、それから利益を得る可能性がある人のために、別の Linux ホスティング アカウントで cron ジョブを作成し、必要な ASP .NET URL を呼び出す必要がありました。管理の恐怖ですが、仕事をします。

于 2012-01-11T06:06:18.993 に答える