【问题标题】:Is it possible to override the relative path ~/ throughout my web application?是否可以在我的 Web 应用程序中覆盖相对路径 ~/?
【发布时间】:2011-04-28 05:25:24
【问题描述】:

背景故事
我目前正在更新现有的 Web 应用程序以支持多租户环境。今天,我们目前在http://www.example.com/MyApp 上托管了一个应用程序,但现在我们必须能够在同一个 Web 应用程序上支持多个客户端。

所以每个客户端都应该能够通过以下网址访问应用程序: http://www.example.com/MyApp/Client1
http://www.example.com/MyApp/Client2

Web 应用程序是一个 ASP.NET Webforms 应用程序,我们也在升级以使用 .NET 4。我已经实现了 ASP.NET 4 中可用的新路由,并且我已经放置了适当的路由以支持多租户架构。

示例 URL http://www.example.com/MyApp/Client1/SomeModule/SomePage.aspx 将路由到并执行 /MyApp/SomeModule/SomePage.aspx,我可以从 RouteData 中访问客户端部分。

但是……

主要问题:
我们在应用程序的许多部分都有使用 url 的链接,例如 ~/SomeModule/SomePage.aspx,所以当它们呈现给浏览器时,它们仍然会显示 /MyApp/SomeModule/SomePage.aspx,但我真正想要的是让它包含我要注入的路由值之一像MyApp/Client1/SomeModule/SomePage.aspsx这样的客户页面

有没有办法在我的整个应用程序中覆盖 ~/ 的含义,而无需遍历整个应用程序并更新链接?

【问题讨论】:

  • 在使用路由或 url-rewriting 时这是一个有趣且相关的问题。
  • @Wallace Breza 你完成了上述任务吗如果是的话你能分享我这些想法吗

标签: c# asp.net routing asp.net-4.0


【解决方案1】:

将 Page 对象上的 AppRelativeVirtualPath 属性设置为所需的路径。但是您必须在创建处理程序后将其作为第一件事,因为添加到 Controls-collection 的每个控件都将从其父级继承此值。

一种方法是子类化 PageHandlerFactory 类,该类负责在您请求 .aspx 文件时创建 Page 实例。使用以下代码覆盖GetHandler

public override IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path)
{
    var handler = (Page)base.GetHandlerHelper(context, requestType, VirtualPath.CreateNonRelative(virtualPath), path);
    page.AppRelativeVirtualPath = "...";

    return page;
}

当然还要更改 web.config 中 httpHandlers 下的注册以指向新的工厂类。

【讨论】:

  • 我试过了,但是更改 AppRelativeVirtualPath 似乎不会影响我页面上控件(例如 HyperLink)中的 url。
【解决方案2】:

我似乎无法覆盖~/。我们决定采用不同的方法并创建实用方法来帮助管理我们的多租户环境中的链接和路径。

我认为实际完成此任务的最佳选择是实现IUrlResolutionService,但我们无法成功完成这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2012-02-22
    • 2012-02-09
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多