C# MVC4->;将一条路径映射到另一条路径(不是控制器)

C# MVC4->;将一条路径映射到另一条路径(不是控制器),c#,asp.net-mvc-4,ihttphandler,C#,Asp.net Mvc 4,Ihttphandler,好吧,让我换一种方式问这个问题。我们有一个网络应用程序。我们有付费用户和试用用户。它们中的每一个都有一个以其用户id命名的文件夹,这就是它们的代码所在的位置。代码从URL获取用户id,因此我们无法更改URL。我想合并代码的位置,这样人们就可以访问与现在相同的URL(sitename/username),但它将从单个位置返回应用程序代码(这是一个文件夹结构)。我已经尝试了我能想到的一切,但是Server.Transfer无法传输到文件夹,传输到index.html不起作用,Server.Trans

好吧,让我换一种方式问这个问题。我们有一个网络应用程序。我们有付费用户和试用用户。它们中的每一个都有一个以其用户id命名的文件夹,这就是它们的代码所在的位置。代码从URL获取用户id,因此我们无法更改URL。我想合并代码的位置,这样人们就可以访问与现在相同的URL(sitename/username),但它将从单个位置返回应用程序代码(这是一个文件夹结构)。我已经尝试了我能想到的一切,但是Server.Transfer无法传输到文件夹,传输到index.html不起作用,Server.TransferLocation和(当然)响应。重定向更改客户端的URL

我在RouteHandler中尝试过这样做,在控制器中,这没有什么区别,我找不到一种方法来透明地将用户重定向到中央代码库。理想情况下,我会在代码中这样做,这样我可以验证他们是什么类型的用户,并相应地重定向他们

经过多次迭代后,下面是核心代码:

public class FarmHttpHandler : IRouteHandler
{
    enum UserType { Invalid = -1, Standard = 1, Tester = 2, Developer = 3}

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        // Note - this has to be a valid URL, or it will loop forever, as our HTTP handler is at the base level.
        // We need to add a 'bad request' page, or it could default to the demo ( this would be a support nightmare though, if someone mistyped their URL,
        // they would think it was fine, at first.
        string redirect = "/Home/Error";

        var routeValues = requestContext.RouteData.Values;

        if (routeValues.ContainsKey("farmName"))
        {
            string farmName = routeValues["farmName"].ToString();


            string baseUrl = "/";// HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.AbsolutePath, "/");

            switch(GetUserType(farmName))
            {
                case UserType.Invalid:
                    break;
                case UserType.Developer:
                    redirect = baseUrl + Settings.BetaAppPath;
                    break;
                case UserType.Standard:
                    redirect = baseUrl + Settings.FullAppPath;
                    break;
                case UserType.Tester:
                    redirect = baseUrl + Settings.TesterAppPath;
                    break;
            }
        }

        HttpContext.Current.Server.TransferRequest(redirect);

        requestContext.HttpContext.RewritePath(redirect);


        return requestContext.HttpContext.Handler;
    }
调用该函数,但重写路径没有做任何事情(错误表明没有返回IHttpHandler),TransferRequest可以工作,但浏览器中的URL会更改。代码还使用图像等的相对路径,这些路径不会加载(不确定是否可以修复此问题)。

答案是

         return BuildManager.CreateInstanceFromVirtualPath(URl, typeof(Page)) as Page; 

这就是从routehandler返回重定向的方式。遗憾的是,这对我来说不起作用,浏览器无法在我们的web应用程序中重定向请求,并且它无法将请求发送到完整的URL,这意味着我无法检测到它们来重新映射它们。

您可能在谈论URL重写。。。非常小的示例会有很大帮助(10-15行:传入url+您想要返回的控制器/原始文件+(可能)路由表)也许我是。上次我问的时候我贴了代码,它似乎制造了混乱,给我的答案并没有解决我的问题。让我添加一些代码…@cgraus
farmName
存储在哪里?是上下文中的值。事实上,这就是URL。然后它存储在SQL数据库中,这就是我验证它的方式。所有这些都不是问题,所有这些都很有效。我不能做的是重定向请求而不更改客户端URL。