【问题标题】:How to set a custom HttpHandler without using HttpContext.RemapHandler如何在不使用 HttpContext.RemapHandler 的情况下设置自定义 HttpHandler
【发布时间】:2011-10-19 17:20:01
【问题描述】:

这是场景:

我想为特定 URL 运行一个 HttpHandler,但这些 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

我当时认为可能(但没有)是 HttpContext.Handler = x;而不是 HttpContext.RemapHandler(x);

以这种方式设置时,HttpContext.CurrentHandler 得到更新,一切看起来都很棒,但自定义处理程序的 ProcessRequest() 永远不会被调用。

提前感谢您的想法/cmets/洞察力。

【问题讨论】:

    标签: c# iis-7 iis-6


    【解决方案1】:

    你见过吗?您可以使用路由将非相同结尾的扩展名添加到同一个处理程序。

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

    更新

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

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

    希望对您有所帮助。请告诉我们您的进展情况。

    【讨论】:

    • 您好伯尼,感谢您的建议。不幸的是,我认为它不适用于我的情况,因为我还需要根据 HTTP Referrer 内容做出处理程序决策,而不仅仅是 URL。但是,我原来的问题中没有具体说明。如果我在接下来的几周内没有收到任何进一步的回复,我会暂时对此进行投票并将其标记为答案。毕竟,您确实按照书面形式回答了问题。再次感谢!
    • @JLB61000 我已经更新了答案,希望这能给你更多的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2010-10-11
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多