2011-08-04 78 views
5

這裏的情景:如何設置一個自定義的HttpHandler不使用HttpContext.RemapHandler

我有,我想對特定URL運行一個HttpHandler,但這些網址沒有一致的擴展,這樣我就可以在web.config中使用httpHandlers映射處理程序。

相反,我有一個自定義的HttpModule,我訂閱PostAuthenticateRequest,檢查一些條件,並使用HttpContext.RemapHandler()分配我的自定義處理程序(如果當前URL符合要求)。

這是所有工作的偉大,但是...

爲了提高性能,我想只能做,如果處理程序尚未分配我的URL檢查和處理程序分配。我不會告訴你爲什麼我的處理程序只適用於沒有分配其他處理程序的情況,但情況總是如此。

這裏真正的問題是,如果處理程序已經分配上PostMapRequestHandler一個只能測試,到那個時候,爲時已晚使用RemapHandler(),因爲一個InvalidOperationException會拋出(見http://msdn.microsoft.com/en-us/library/system.web.httpcontext.remaphandler.aspx

我認爲可能在這一點(但不)是HttpContext.Handler = x;而不是HttpContext.RemapHandler(x);

當設置這種方式時,HttpContext.CurrentHandler被更新,並且都顯得光榮,但自定義處理程序的ProcessRequest()永遠不會被調用。

預先感謝您的想法/意見/見解。

回答

3

你見過?您可以使用路由將相同的結束擴展名獲取到相同的處理程序。

http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

修訂

我建議,如果您有問題的設置處理程序,你可以嘗試處理PostResolveRequestCache事件。這是Url路由模塊插入以通過調用context.RemapHandler來選擇處理程序的一點。可能您甚至可以覆蓋UrlRoutingModulePostResolveRequestCache方法,並調用base.PostResolveRequestCache(context),然後根據需要設置您的處理程序。

另外,你可以看看總是將你的處理程序映射到web.config中的堆棧底部並捕獲所有內容。然後傳遞不感興趣的請求,或者如果不需要,可以取消映射處理程序(不確定unmap是否可用)。

希望得到這個幫助。請讓我們知道你的方式。

+0

嗨,伯尼,謝謝你的建議。不幸的是,我不認爲它適用於我的情況,因爲我還需要根據HTTP Referrer內容做出處理程序決定,而不是單獨使用URL。但是,我原來的問題沒有說明。如果我在接下來的幾周內沒有收到任何進一步的答覆,我會立刻讚揚這一點,並將其標記爲答案。畢竟,你確實是以書面形式回答了這個問題。再次感謝! – JLB61000

+0

@ JLB61000我已經更新了答案,希望這會給你更多的想法。 –

相關問題