跨多个子域的URL路由

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

挑战在于我们的托管服务提供商的控制面板允许对子域进行两种forms的重定向,而且这两种forms都不符合要求。 选择是:

  • 重定向到URL。 选择是否重定向到相对于请求URL的确切目的地或目的地。

  • 重定向到我的主机空间中的特定文件夹。

我将尝试说明预期的行为。 假设默认路由是{controller}/{action}/{id} ,我希望URL http://subdomain.welcome.com/a/b由MVC应用程序处理,如http://welcome.com/subdomain/a/b

URL重定向可以解决此问题,除了用户在浏览器中看到URL更改的事实。 我们不希望客户端看到重定向发生。

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

编辑:

为了找到答案,我会简化一下。 “重定向到URL”不能执行我想要的操作,因此会重定向到文件夹。

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

你能否让你的托管网站主机标题响应*.mydomain.com ? 这意味着,您的网站是否可以接收主域名的任何子域名请求? 如果是这样,那么请参考这篇关于如何处理MVC应用程序中的子域路由的post ,你应该好好去。

我会更新post中的代码,以使代码更简洁。 在任何情况下,请确保您尝试转到不存在的子域时遇到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; } } 

不确定这是否过度(这实际上用于从zip文件或资源文件等提供页面),但是……也许你可以使用虚拟路径提供程序?..

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

 HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider()); 

然后实现一个inheritance自VirtualFile的类,并从虚拟路径提供程序实现中的GetFile()覆盖中提供它:

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

注意:根据您对URL格式的规则等,IsVirtualFile是您必须实现的function。