【问题标题】:Is there No Way to Detect Routed URL in ASP.NET?有没有办法在 ASP.NET 中检测路由 URL?
【发布时间】:2011-02-16 03:01:17
【问题描述】:

是否无法检测当前请求是否通过 ASP.NET 4.0 URL 路由进行映射?

我有一个处理应用程序的BeginRequest 事件的HTTP 模块。我发现所有文件类型都会调用这个处理程序,包括 CSS、JS、图像文件等,如果目标文件是 ASPX 页面,我只想执行一个操作。

在路由页面的情况下,HttpRequest 对象的所有属性都反映了请求的 URL,而不是请求映射到的 ASPX 页面。如何确定请求是否由 ASPX 文件处理?

感谢您的任何建议。

【问题讨论】:

    标签: asp.net url-routing asp.net-4.0


    【解决方案1】:

    在 Begin Request 事件内部,尚未为特定 URL 定义处理程序。

    因此,由于 IIS 尚未做出决定,因此无法确定实际最终会处理该 URL 的内容。这发生在触发 Begin Request 之后,这就是调用所有文件类型的原因。

    这就是为什么 Begin Request 不是一个真正执行需要专门针对 .NET 文件的代码的好事件的原因之一。 Begin Request 方法的一个很好的用途是向请求或响应添加 cookie 或标头。无论最终处理请求是什么,这些都可以毫无问题地处理。

    如前所述,我建议使用继承自 System.Web.UI.Page 的基类,您的所有其他页面都继承自该基类,或者创建母版页。

    现在,如果不明确知道您要做什么,就很难给出一个好的解决方案。可以测试一个 URL 以检查它是否会被路由触发,但我不知道如何,而且当您可以通过基类或母版页处理它时,它似乎也过分了。

    【讨论】:

    • 这似乎是正确的答案(不幸的是)。我想要做的是实现 HTTP 压缩。我已经对此进行了一段时间的研究,但我发现没有任何东西可以可靠地工作。我已经从我描述的 HTTP 处理程序中得到了一些工作。但是,每个文件类型都会调用处理程序。我需要确定请求是否针对页面。由于路由 URL 没有扩展名,我怎么知道?
    • 将您的 HTTP 模块放在应用程序生命周期中的更下方msdn.microsoft.com/en-us/library/bb470252.aspx PostMapRequestHandler 之后的任何内容都应该在上下文中为您提供一些关于将用于执行请求的 Handler 的指示。
    • 我尝试了 PreRequestHandlerExecute,但令我惊讶的是,像 Request.PhysicalPath still 这样的成员会显示未路由的 URL。但是,看起来 Request.RequestContext.RouteData.RouteHandler.VirtualPath 实际上确实引用了目标页面。就我而言,“~/Listing.aspx”。也许这是可行的。谢谢。
    • 是的,这很奇怪。即使在 Request.PhyscialPath 后面的实际 ASPX 页面代码中,仍将指向基于 URL 的假定物理路径。我的想法最初更多的是使用 HttpContext.Current.Handler。它将为您提供一些有关实际处理请求的类的信息,并且如果未路由,它也应该始终存在于 RouteData 将为空的位置,但使用/理解可能有点困难。
    【解决方案2】:

    您可以创建一个 BasePage 作为应用程序中所有页面的基类,并在那里处理 Page_Load 事件,而不是使用 HTTP 模块。

    【讨论】:

    • 谢谢。但我真的希望没有必要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2011-10-22
    • 2020-07-18
    相关资源
    最近更新 更多