根据整体更改应用程序行为 URL

Change application behaviour based on whole URL

这听起来可能很奇怪。我希望有两个相同的应用程序实例根据用于访问它们的 URL 表现不同。

我在 IIS 上部署了两个应用程序实例,我们将它们的路径称为 dev.routeonedev.routetwo。两个实例都指向同一个源。现在,假设我在这个项目的 MainController 中有两个操作,ActionOneActionTwo,链接到 HTML 个视图 viewone.cshtmlviewtwo.cshtml分别。

路由配置将像这样设置(在 RegisterRoutes 中):

routes.MapRoute(
    name: "ActionOne",
    url: "one",
    defaults: new { controller = "MainController", action = "ActionOne" }
);

routes.MapRoute(
    name: "ActionTwo",
    url: "two",
    defaults: new { controller = "MainController", action = "ActionTwo" }
);

使用此设置,两个 IIS 实例的行为相同:

http://dev.routeone/one -> ActionOne
http://dev.routeone/two -> ActionTwo

http://dev.routetwo/one -> ActionOne
http://dev.routetwo/two -> ActionTwo

我想要一种情况,使用相同的源代码,URL 会在输入路由时指示哪个操作是 运行。具体来说,在这种情况下,dev.routeone 将两条路线都指向 ActionOne,而相反 dev.routetwo:

http://dev.routeone/one -> ActionOne
http://dev.routeone/two -> ActionOne

http://dev.routetwo/one -> ActionTwo
http://dev.routetwo/two -> ActionTwo

或者更好的是,在没有配置路由的情况下适当地直接:

http://dev.routeone/ -> ActionOne
http://dev.routetwo/ -> ActionTwo

我不确定这是否可行或可取,但我愿意接受任何解决方案。有没有办法 'look back' 超过不受应用程序控制的 URL 并使用它来确定行为?

添加网站时,只需在此屏幕上指定相同的物理路径并使用不同的主机名:

鉴于我知道将要访问该站点的两个 URL,我能够做到这一点(请注意格式略有不同,因为我已经在操作中引入了 ID 参数) :

var appID = System.Web.Hosting.HostingEnvironment.ApplicationID;

if (appID.Contains("routeone")
{
    routes.MapRoute(
        name: "ActionOne",
        url: "{id}",
        defaults: new { controller = "MainController", action = "ActionOne", id = UrlParameter.Optional }
    );
}

if (appID.Contains("routetwo")
{
    routes.MapRoute(
        name: "ActionTwo",
        url: "{id}",
        defaults: new { controller = "MainController", action = "ActionTwo", id = UrlParameter.Optional }
    );
}

此格式不是动态的,但可以扩展以处理越来越复杂的更多情况。