1

HTTPモジュールでイベントを宣言したので、サブスクライバーにtrue / false値をポーリングして、HTTP応答を微調整するタスクを続行する必要があるかどうかを判断します。1人のサブスクライバーだけがtrueと答えた場合、そのサブスクライバーはそのロジックを実行します。

これは意味がありますか?
私が見ていない潜在的な落とし穴はありますか?

public class ResponseTweaker : IHttpModule {

    // to be a list of subscribers 
    List<Func<HttpApplication, bool>> listRespondants = new List<Func<HttpApplication, bool>>();

    // event that stores its subscribers in a collection
    public event Func<HttpApplication, bool> RequestConfirmation {
        add {
            listRespondants.Add(value);
        }
        remove {
            listRespondants.Remove(value);
        }
    }

    public void Init(HttpApplication context) {
        if (OnGetAnswer(context)) // poll subscribers ...
            // Conditionally Run Module logic to tweak Response ... 
    }

    /* Method that polls subscribers and returns 'true'
     *  if only one of them answers yes.
     */
    bool OnGetAnswer(HttpApplication app) {
        foreach (var respondant in listRespondants)
            if (respondant(app))
                return true;
        return false;
    }

    // etc...
}
4

1 に答える 1

1

それは良い考えではないと思います。問題の量は、次のようないくつかの要因によって異なります...

  1. listRespondantsはルート化されるため、アプリケーションの有効期間があります。追加されるアイテムがたくさんある場合、メモリフットプリントは増え続けます。したがって、それはむしろこのリストのアイテムの数に帰着します。

以下はショーストッパーになることができます...

  1. IISResetまたはApplicationDomainrecycleは、このすべての情報をアプリケーションから削除します。このリストにアイテムを戻す予定はありますか?データベース?

  2. Webファームがある場合はどうなりますか。このアプリケーションは、スケールアウトしようとした瞬間に期待どおりに機能しません。その理由は...Webファーム内のすべてのサーバーに同じモジュールがロードされている場合でも、ワーカープロセスのデータはローカルです。したがって、listRespondantsは、データベースからロードしない限り、すべてのサーバーで異なります。

于 2010-11-07T04:47:24.293 に答える