通用Http模块

时间:2009-10-15 16:39:43

标签: c# asp.net http module generics

问题

我正在尝试在asp.net C#中创建一个通用的http模块来处理由enum定义的角色,我希望能够通过泛型参数进行更改。这样就可以将通用模块与为每个项目定义的任何类型的枚举一起使用。

模块挂钩到FormsAuthenticationModule的Authenticate事件,并在每个网站请求时调用。该模块公开了可以在global.asax中定义的公共事件。

但我似乎无法弄清楚如何使通用http模块像非通用模块一样工作。

有3个主要问题。

  1. 我无法在web.config中注册通用的http模块,就像任何其他模块一样,因为我无法指定通用参数,或者可能以某种方式? 据我所知,解决这个问题的方法是创建一个非泛型的http模块,该模块初始化通用的HttpModule(泛型参数在web.config中的模块的自定义部分中定义)。
    但这引入了下一个问题。

  2. 我无法找到如何使通用模块公开的公共事件可以通过global.asax挂钩,就像通常使用非泛型模块一样,只需使用名称生成一个公共方法喜欢ModuleClassName_PublicEventName http模块上的init()方法获取对global.asax中创建的HttpApplication对象的引用。我不知道它是否有可能通过反射来搜索方法,如果它们是在global.asax(HttpApplication超类)中定义的,那么用正确的事件处理程序将它们连接起来?或者如果可以使用HttpApplication对象的任何方法?

  3. 我如何存储并稍后获取对非通用模块中创建的通用模块的引用?
    我可以使用HttpContext.Current.ApplicationInstance.Modules.Get(“TheModule”)获取非泛型模块;但有什么办法可以在非通用模块中存储对通用模块的引用(无法弄清楚它应该如何可能),或者将它存储在其他地方以便我总能得到它?如果我可以从global.asax等获得对泛型模块的引用,那么nr中提到的事件。 2可以手动连接到方法。


  4. 思考和其他可能的解决方案

    不是在web.config中注册模块,而是可以通过覆盖HttpApplication的Init方法并在模块上调用Init方法来手动初始化。

    但这会引入一些新问题。

    模块将不再添加到ModulesCollection中。所以我需要在其他地方存储引用。 这可以通过global.asax中的属性完成,并通过实现接口,或者通过创建继承自HttpApplication的通用抽象基类型来实现,即global.asax可以继承。在通用抽象基类型中,我也可以覆盖init方法。

    它仍然不会自动将global.asax中的方法与通用模块中的事件挂钩。如果可以通过反射在HttpApplication的超类型中搜索已定义的方法,那么它可以自动完成。

    但我可以通过Init方法或其他任何地方手动将global.asax中的方法与泛型模块中的事件连接起来,方法是引用通用模块。

    如果我选择手动初始化通用模块,它确实需要实现IHttpModule接口。我还可以将所有代码移动到继承自HttpApplication的抽象基类型。

    我更愿意通过在web.config中定义模块来注册模块,因为它将是最简单,最自然/最合理的解决方案。如果它可以作为HttpModule保存而不是必须定义从HttpApplication继承的抽象基类型,那么它会更好。否则它会更加笨拙并且不像我想要的那样松散和可插入(但也许它是不可能的。)

    另一种选择是使它全部静止 据我所知,我必须以某种方式确保只能将一个方法添加到公共静态事件中,因此每次创建global.asax的新实例时都不会添加引用。

    我简直无法找出最佳解决方案。我一直在搞乱这个问题并且好好思考几天。

    也许有一个我没有想过的选择?

    希望那里的任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

解决方案是创建非泛型模块,通过从web.config获取泛型参数来创建泛型类的实例。