如何在不使用HttpContext.RemapHandler的情况下设置自定义HttpHandler

JLB*_*000 5 c# iis-7 iis-6

这是场景:

我有一个HttpHandler,我想为特定的URL运行,但这些URL没有一致的扩展,所以我不能使用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()永远不会被调用.

提前感谢您的想法/意见/见解.

Ber*_*ite 3

你见过这个吗?您可以使用路由将不同结尾的扩展获取到同一处理程序。

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

更新

我建议如果您在设置处理程序时遇到问题,您可以尝试处理该PostResolveRequestCache事件。这是 Url 路由模块插入以通过调用选择处理程序的点context.RemapHandler。也许您甚至可以重写PostResolveRequestCache的方法UrlRoutingModule并调用base.PostResolveRequestCache(context),然后根据需要设置您的处理程序。

或者,您可以考虑始终将处理程序映射到 web.config 中的堆栈底部,并包含所有内容。然后,如果不需要,则传递不感兴趣的请求或取消映射处理程序(不确定取消映射是否有效)。

希望这有帮助。请让我们知道您的进展情况。