代码之家  ›  专栏  ›  技术社区  ›  Jesse Hallam

跨多个子域的URL路由

  •  0
  • Jesse Hallam  · 技术社区  · 16 年前

    我发现自己处境困难。我们正在开发一个由多个部分组成的ASP.NETMVC2应用程序。设计目标是使这些部分跨多个子域。每个子域都有自己的控制器。

    挑战在于,我们的托管提供商的控制面板允许两种形式的子域重定向,而它们似乎都不符合要求。选择包括:

    • 正在重定向到URL。可以选择重定向到确切的目的地还是相对于请求URL的目的地。

    • 重定向到我的托管空间中的特定文件夹。

    我将试着说明打算采取的行动。假设默认路由是 {controller}/{action}/{id} ,我想要网址 http://subdomain.welcome.com/a/b 由MVC应用程序处理,如 http://welcome.com/subdomain/a/b .

    重定向到MVC应用程序根文件夹根本不起作用。应用程序没有接收请求,IIS会传回4xx错误。

    为了找到答案,我将把它简化一点。“重定向到URL”没有执行我想要的操作,因此只能重定向到文件夹。

    如果我将一个子域重定向到我的MVC应用程序的根文件夹,而IIS不会接收请求,这是IIS或我的提供商的限制吗?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

    你能让你的托管网站主机头响应吗 *.mydomain.com ? 意思是,你的网站可以接受你的主域名的任何子域名的请求吗?如果是,则参考 this post 关于如何在MVC应用程序中处理子域路由,你应该很乐意去做。

    不过,我会更新帖子中的代码,使代码更简洁。在任何情况下,确保你有你的404错误的人试图去子域不存在的地方。

    public class ExampleRoute : RouteBase
    {
    
        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            var url = httpContext.Request.Headers["HOST"];
            var index = url.IndexOf(".");
    
            if (index < 0)
                return null;
    
            var subDomain = url.Substring(0, index);
    
                var routeData = new RouteData(this, new MvcRouteHandler());
                routeData.Values.Add("controller", subdomain); //attempts to go to controller action of the subdomain
                routeData.Values.Add("action", "Index"); //Goes to the Index action on the User2Controller
    
                return routeData;
        }
    
        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            //Implement your formating Url formating here
            return null;
        }
    }
    
        2
  •  0
  •   PjL    16 年前

    不确定这是否是过度杀戮(这实际上是用来提供来自zip文件或资源文件等的页面),但是。。。也许您可以使用虚拟路径提供程序?。。

    实现一个从VirtualPathProvider继承的类,并在全局启动中注册它,如下所示:

    HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());
    

    然后实现一个从VirtualFile继承的类,并通过虚拟路径提供程序实现中的GetFile()重写为其提供服务:

    public override VirtualFile GetFile( string virtualPath )
    {
     if( IsVirtualFile(virtualPath) )
        return new MyVirtualFile(virtualPath);
     return base.GetFile(virtualPath);
    }
    

    注: IsVirtualFile是一个您必须实现的函数,它基于关于URL格式等的规则。

    推荐文章