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

时间:2013-12-07 03:51:41

标签: c# asp.net-mvc-4 ihttphandler

好的,让我以不同的方式问这个问题。我们有一个网络应用程序。我们有付费和试用用户。他们每个人都有一个以用户名命名的文件夹,这就是他们的代码所在的位置。代码从URL获取用户ID,因此我们无法更改URL。我想整合代码的位置,以便人们转到与今天相同的URL(sitename / username),但它将从单个位置返回应用程序代码(这是一个文件夹结构)。我已经尝试了我能想到的一切,但Server.Transfer无法转移到文件夹,转移到index.html不起作用,Server.TransferLocation和(当然)Response.Redirect更改客户端的URL

我已尝试在RouteHandler中执行此操作,并且在Controller中,它没有任何区别,我找不到将用户透明地重定向到中央代码库的方法。理想情况下,我会在代码中执行此操作,因此我可以验证它们是什么类型的用户并相应地重定向它们。

经过多次迭代,现在是核心代码:

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在浏览器中更改。代码还使用图像等的相对路径,这些不加载(不确定我是否可以实际修复此问题)。

1 个答案:

答案 0 :(得分:0)

答案是

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

这就是你如何从路由器返回重定向。遗憾的是,它对我不起作用,浏览器无法在我们的Web应用程序中重定向请求,并且它不会向完整URL发出请求,这意味着我无法检测到它们以重新映射它们。