跨多个子域的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。