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

时间:2011-08-04 06:54:57

标签: c# iis-7 iis-6

以下是该方案:

我有一个HttpHandler,我想为特定的URL运行,但这些URL没有一致的扩展名,所以我无法使用web.config中的httpHandlers映射处理程序。

相反,我有一个自定义的HttpModule,我在其中订阅PostAuthenticateRequest,检查一些条件,并在当前URL符合条件的情况下使用HttpContext.RemapHandler()分配我的自定义处理程序。

这一切都很有效,但是......

为了提高性能,我只想在尚未分配处理程序的情况下进行URL检查和处理程序分配。我不会厌倦为什么我的处理程序只适用于没有分配其他处理程序的情况,但情况总是如此。

这里真正的问题是只能测试PostMapRequestHandler上是否已经分配了一个处理程序,到那时,使用RemapHandler()为时已晚,因为会抛出InvalidOperationException(参见http://msdn.microsoft.com/en-us/library/system.web.httpcontext.remaphandler.aspx)< / p>

我认为可能在那一点起作用(但不是)是HttpContext.Handler = x;而不是HttpContext.RemapHandler(x);

当以这种方式设置时,HttpContext.CurrentHandler会更新并且所有内容都显得光彩夺目,但自定义处理程序的ProcessRequest()永远不会被调用。

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

1 个答案:

答案 0 :(得分:3)

你看到了这个吗?您可以使用路由来获取同一处理程序的非相同结尾扩展名。

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

<强>已更新

我建议如果您遇到问题设置处理程序,可以尝试处理PostResolveRequestCache事件。这是Url路由模块通过调用context.RemapHandler来插入以选择处理程序的要点。您甚至可以覆盖PostResolveRequestCache的{​​{1}}方法并调用UrlRoutingModule,然后根据需要设置处理程序。

或者你可以看看总是在web.config中使用catch all映射堆栈底部的处理程序。然后传递不感兴趣的请求或取消映射处理程序(不确定unmap是否可行),如果不需要的话。

希望这有帮助。请告诉我们你的工作方式。