从多租户asp.net mvc应用程序中的URL中识别租户

时间:2014-06-24 11:57:51

标签: asp.net-mvc routing asp.net-mvc-routing multi-tenant

我正在创建一个多租户asp.net应用程序。我希望我的网址关注

**http://www.example.com/test1/test2/**{tenantName}/{controller}/{action}
**http://www.example.com/test1/**{tenantName}/{controller}/{action}
**http://www.example.com/**{tenantName}/{controller}/{action}

此处以粗体显示的网址部分是固定的(不会更改) {tenantName} =将是逻辑租户实例。

我已关注this链接 处理此问题的路由是什么?

2 个答案:

答案 0 :(得分:3)

这很简单:

routes.MapRoute(
    "MultiTenantRoute", // Route name
    "test1/test2/{tenantName}/{controller}/{action}/{id}", // URL with parameters
    new { id = UrlParameter.Optional } // Parameter defaults, if needed
);

没有大括号的部分必须匹配。大括号内的部件将转换为路径数据参数。我已经添加了一个可选参数id,您可以在控制器中找到它,但您可以自定义它。您也可以像往常一样为tenantName,controller或action提供默认值。

请记住,路线按照他们注册的顺序进行评估,因此您应该在任何其他路线之前注册此路线。

问题更新后编辑

您无法在路径开头指定catch all all参数:{*segment}。这是不可能的。 ASP.NET MVC不知道要包含在这部分中的段数,以及路由中其余参数剩余的段数。

因此,您需要为每种可能的情况添加路线,同时考虑将使用匹配的第一条路线。所以你需要以这样的额外参数开头的路线:

{tenanName}...
{segment1}{tenanName}...
{segment1}/{segment2}/{tenanName}...

根据预期网址的结构,您可能需要添加约束以确保路由正确匹配。这可以通过将第四个参数传递给thw MapRoute方法来完成。这是一个匿名类,如deafults参数,但每个参数的指定值是一个约束。这些约束,就其最简单的形式而言,只是字符串,将用作正则表达式(正则表达式)。

如果预期的网址变化极大,then implement yout own routing class

答案 1 :(得分:2)

您可以将路线定义为

routes.MapRoute(
                name: "TennantRoute",
                url: "test1/test2/{tenantName}/{controller}/{action}",
                defaults: new { controller = "Home", action = "Index"}
            );

并且您的操作必须使用名称为tenantName的参数,因为您可能希望根据该决定做出决定...例如

public ActionResult Index(string tenantName)
        {
            return View();
        }

示例:http://localhost:19802/test1/test2/PrerakT/Home/Index

enter image description here

请确保在默认路线上方定义此路径,以便跟踪网址

http://localhost:19802/test1/test2/PrerakT/
http://localhost:19802/test1/test2/PrerakT/Home/
http://localhost:19802/test1/test2/PrerakT/Home/index

如果我希望test1和test2可以更改怎么办......

routes.MapRoute(
                name: "TennantRoute",
                url: "{test1}/{test2}/{tenantName}/{controller}/{action}",
                defaults: new { controller = "Home", action = "Index" }
            );

public ActionResult Index(string tenantName, string test1, string test2)
        {
            return View();
        }

根据您对问题的更新

routes.MapRoute(
                name: "TennantRoute1",
                url: "test1/test2/{tenantName}/{controller}/{action}",
                defaults: new { controller = "Home", action = "Index" }
            );
            routes.MapRoute(
                name: "TennantRoute2",
                url: "test1/{tenantName}/{controller}/{action}",
                defaults: new { controller = "Home", action = "Index" }
            );
            routes.MapRoute(
                name: "TennantRoute3",
                url: "{tenantName}/{controller}/{action}",
                defaults: new { controller = "Home", action = "Index" }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );