2008-10-11 43 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