2008-10-11 80 views
2

在ASP.NET中,当在包含HttpHandler的类库中构建Web服务器控件时,是否可以自动注册处理程序而无需手动编辑Web应用程序的web.config文件?如何自动注册Web服务器控件所需的HttpHandler?

我有一个类库包含一个CompositeControl。在复合控件中,我有一个ImageUrl属性设置为HttpHandler的Image控件。

<add verb="*" path="Icon.ashx" type="ClassLibrary.MyHandler" /> 

我读过this blog post其中概述了如何欺骗设计成这样:为了使的HttpHandler从使用类库我不得不在web.config文件中的条目应用程序工作对你来说,但是我想要一些不需要我的类库的用户在Visual Studio中输入设计器的工作。

回答

5

我不认为有任何方法可以在运行时注册处理程序。您已有的代码的变体将在运行时修改web.config的其他部分,但如果您尝试修改<httpHandlers>,则会悄然失败。您可以像解析其他任何XML文件一样解析和编辑web.config,但不一定假定应用程序在运行时具有对web.config的写入权限。

但是,您可以通过处理应用程序的BeginRequest事件来获得与HttpHandler相同的效果。第一次加载控件时添加一个事件处理程序,并在该处理程序中可以检查Request.Url是否应该照顾,如果是,请调用ProcessRequest代码。最后,调用HttpApplication.CompleteRequest()来跳过正常的请求处理。你会为每个请求增加一点开销,所以这取决于你是否值得避免手动web.config编辑。

部分解决方案是在运行时使用IsHttpHandlerRegistered()方法,这样如果处理程序未注册,则可以提供有用的异常。这似乎是ASP.NET本身如何处理需要HttpHandler的功能。读取配置在运行时应该没问题,但获取配置对象稍有不同:

Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~"); 
+0

非常有帮助!我会把这个开放一段时间,看看其他人是否有其他想法......否则我们可能不得不将这个“接受的答案” – 2008-10-13 01:41:08