Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何动态重写url,然后在MVC中重新路由?_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 如何动态重写url,然后在MVC中重新路由?

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

我正试图在一个大型ASP.NET MVC应用程序上改进multitenancy。我希望所有以
/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,使其意识不到我在这么做,所以我不必改变这个(大型)系统中的每一条路线。这有助于澄清吗?