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

时间:2017-07-21 15:35:23

标签: .net asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

这可能听起来很奇怪。我希望根据用于访问应用程序的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

我不确定这是可行的还是可取的,但我对任何解决方案持开放态度。有没有办法回顾'通过不受应用程序控制的URL并使用它来确定行为?

2 个答案:

答案 0 :(得分:0)

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

enter image description here

答案 1 :(得分:0)

看到我知道将要访问该网站的两个网址,我能够做到这一点(请注意稍微不同的格式,因为我已经为这些操作引入了ID参数):< / p>

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 }
    );
}

这种格式不是动态的,但可以扩展以处理更多复杂性增加的情况。