1

我已经在 HTTP 模块上声明了一个事件,因此它将轮询订阅者的真/假值,以确定它是否应该继续执行调整 HTTP 响应的任务。如果只有一个订阅者回答为真,那么它就会运行它的逻辑。

这有意义吗?
是否有我没有看到的潜在陷阱?

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 或应用程序域回收将从您的应用程序中删除所有这些信息。您打算如何将这些项目带回此列表中?数据库?

  2. 如果您有一个 Web 场怎么办。当您尝试向外扩展时,此应用程序将无法按预期工作。原因是......即使您在网络场中的所有服务器上加载了相同的模块,工作进程中的数据也是本地的。因此,除非您从某个数据库加载它,否则所有服务器中的 listRespondants 都会有所不同。

于 2010-11-07T04:47:24.293 回答