如何自动注册Web服务器控件所需的HttpHandler?

Sha*_*ler 2 .net c# asp.net

在ASP.NET中,在包含HttpHandler的类库中构建Web服务器控件时,有没有办法自动注册处理程序而无需手动编辑Web应用程序的web.config文件?

我有一个包含CompositeControl的类库.在复合控件中,我有一个Image控件,其ImageUrl属性设置为HttpHandler.为了使HttpHandler能够从使用类库的应用程序工作,我必须在web.config文件中创建一个条目:

<add verb="*" path="Icon.ashx" type="ClassLibrary.MyHandler" />
Run Code Online (Sandbox Code Playgroud)

我已经阅读了这篇博文,其中概述了如何欺骗设计师为您做这件事,但我想要一些不需要我的类库用户在Visual Studio中进入设计器的东西.

ste*_*son 5

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

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

部分解决方案是在运行时使用该IsHttpHandlerRegistered()方法,以便在未注册处理程序时提供有用的异常.这似乎是ASP.NET本身处理需要HttpHandler的功能的方式.在运行时读取配置应该没问题,尽管获取Configuration对象会略有不同:

Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~");
Run Code Online (Sandbox Code Playgroud)