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

本文关键字:路径 另一个 控制器 映射 gt 一个 MVC4- | 更新日期: 2024-07-27 17:16:59

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

这被调用了,但rewritepath什么都不做(错误显示没有返回IHttpHandler),TransferRequest也能工作,但浏览器中的URL发生了变化。该代码还使用图像等的相对路径,并且这些路径不会加载(不确定我是否真的能解决这个问题)。

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

答案是

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

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