C# 如何动态重写url,然后在MVC中重新路由?
我正试图在一个大型ASP.NET MVC应用程序上改进multitenancy。我希望所有以C# 如何动态重写url,然后在MVC中重新路由?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我正试图在一个大型ASP.NET MVC应用程序上改进multitenancy。我希望所有以/client/{client}/{*path}开头的路由都能真正路由到{*more},但是在后台会有一些每个客户端的设置(以便指向特定的数据库等等) 我制作了一个IRouteHandler,看起来它可能真的能工作。但是这里有很多MVC黑匣子我不太明白,所以我想知道是否有MVC专家可以告诉我这种方法是否有问题,或者更好的方法是什么 public class ClientRoute : IRouteHand
/client/{client}/{*path}
开头的路由都能真正路由到{*more}
,但是在后台会有一些每个客户端的设置(以便指向特定的数据库等等)
我制作了一个IRouteHandler
,看起来它可能真的能工作。但是这里有很多MVC黑匣子我不太明白,所以我想知道是否有MVC专家可以告诉我这种方法是否有问题,或者更好的方法是什么
public class ClientRoute : IRouteHandler
{
...
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
this.m_Path = (string)requestContext.RouteData.Values["path"];
this.m_Client = (string)requestContext.RouteData.Values["client"];
string virtualPath = "~/" + this.m_Path;
requestContext.HttpContext.RewritePath(virtualPath);
var route = RouteTable.Routes.GetRouteData(requestContext.HttpContext);
requestContext.RouteData.Values.Clear();
requestContext.RouteData.Values.AddRange(route.Values);
requestContext.RouteData.Route = route.Route;
requestContext.RouteData.RouteHandler = route.RouteHandler;
requestContext.RouteData.DataTokens.Clear();
requestContext.RouteData.DataTokens.AddRange(route.DataTokens);
return new MvcHandler(requestContext);
}
}
您的意思是当用户转到
http://xxx/client/client1/home
,内部转到http://xxx/home
?为什么?我可以想到的一个替代方法是使用IIS重写module@LostInComputer,@ScottStafford:那真的不行。如果http://example.com/client/JoesMeats/Home
已重写为http://example.com/Home
那么该页面上的任何链接都绝对不知道它们属于哪个客户端。@Dan-o。您可以重写URL,使客户端位于查询字符串、服务器变量等中。但是,更大的问题是,为什么要首先重写URL?也许我失踪了something@LostInComputer当前位置你们两个都没有谈论那个。我只是觉得将请求绑定到客户端的机制很重要,因为我能想到的重写url的唯一原因是为了美观。我目前有一个网站,我们为每个客户端在IIS中创建一个新的web应用程序,它有自己的web.config,虚拟目录挂载在/client/client1,/client/client2,等等。我想移动到一个安装在根目录上的web应用程序,并为多个客户端提供服务。我试图欺骗MVC,使其意识不到我在这么做,所以我不必改变这个(大型)系统中的每一条路线。这有助于澄清吗?