2

ASP.NET で動作する Web サイトがあります。XX 時間ごとにデータベース テーブルをチェックし、いくつかの条件が満たされない場合にアクション (メールの送信) を実行するサービスを実行したいと考えています。

使用できません

  1. ホストされたサーバーとしての Windows サービスは、専用サーバーではありません。(コントロールパネルしかありません)
  2. Access 2003 (mdb) をデータベースとして使用しているため、メールを送信するための SQL サービス。App_Data にあります
  3. IISも利用できません

サーバーで何らかのポーリングが必要であることは非常に重要です。
私たちは今、ちょっと立ち往生しています。私たちが持っている代替手段は何ですか?

4

2 に答える 2

2

ASP.NETWebサービスだけを使用してWindowsサービスをシミュレートするために使用できるトリックがあります。

その要点は次のとおりです。

データベースをポーリングする頻度と同じ有効期限で、アイテムをキャッシュに配置します。

アイテムがキャッシュから削除されたときに発生するコールバックを追加します。コールバックメソッドで、ポーリングコードを追加して、実行したいこと(アクセスデータベースの呼び出し、メールの送信など)を実行します。

だから:あなたのグローバルなasaxでは、このようなもの:

private const string DummyCacheItemKey = "pollingCacheKey";

protected void Application_Start(Object sender, EventArgs e)
{
    RegisterCacheEntry();
}

private bool RegisterCacheEntry()
{ 
    if( null != HttpContext.Current.Cache[ DummyCacheItemKey ] ) return false;

    HttpContext.Current.Cache.Add( DummyCacheItemKey, "Test", null, 
       DateTime.MaxValue, TimeSpan.FromMinutes(1), 
       CacheItemPriority.Normal,
       new CacheItemRemovedCallback( CacheItemRemovedCallback ) );

    return true;
}

public void CacheItemRemovedCallback( string key, 
        object value, CacheItemRemovedReason reason)
{
    Debug.WriteLine("Cache item callback: " + DateTime.Now.ToString() );

    // Do the service works

    DoWork();

    ReregisterCacheItem();
}

それは理想的ではありませんが、あなたの制約に適合します。

この手法の詳細については、http://www.codeproject.com/Articles/12117/Simulate-a-Windows-Service-using-ASP-NET-to-run-scを参照してください。

于 2012-06-06T10:59:52.823 に答える
2

ここで言及されています

ASP.NET での簡単なバックグラウンド タスク

ここにそのリンクからのいくつかのスニペットがあります

private static CacheItemRemovedCallback OnCacheRemove = null;

protected void Application_Start(object sender, EventArgs e)
{
    AddTask("DoStuff", 60);
}

private void AddTask(string name, int seconds)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, seconds, null,
        DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
        CacheItemPriority.NotRemovable, OnCacheRemove);
}

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
    // do stuff here if it matches our taskname, like WebRequest
    // re-add our task so it recurs
    AddTask(k, Convert.ToInt32(v));
}

私のテストではうまくいきます。時計仕掛けのようにすべての > ユーザーに 60 秒ごとにバッジが授与されます - Jeff Atwood

于 2012-06-07T06:55:28.487 に答える