我有这样的托管和域名:
www.EXAMPLE.com
我创建了几个这样的子域:
www.PAGE1.EXAMPLE.com www.PAGE2.EXAMPLE.com www.PAGE3.EXAMPLE.com ... etc...
所有这些子域都指向同一个ASP.NET MVC 5应用程序.
我想制作根据子域加载数据的系统.例:
我有文章对象,可以是汽车评论或游戏评论或书评等...
我想www.auto.example.com加载文章类型为Auto的数据,到www.book.example.com我想加载类型为Book等的数据.
将有许多类型的页面.
这样做的最佳做法是什么?
顶级域名www.example.com应该显示其他内容.这将是其他人的主页.
您可以通过编写自定义路径来完成此操作.这是如何(改编自可以基于子域制作ASP.NET MVC路由?)
public class SubdomainRoute : RouteBase { public override RouteData GetRouteData(HttpContextBase httpContext) { var host = httpContext.Request.Url.Host; var index = host.IndexOf("."); string[] segments = httpContext.Request.Url.PathAndQuery.Split('/'); if (index < 0) return null; var subdomain = host.Substring(0, index); string controller = (segments.Length > 0) ? segments[0] : "Home"; string action = (segments.Length > 1) ? segments[1] : "Index"; var routeData = new RouteData(this, new MvcRouteHandler()); routeData.Values.Add("controller", controller); //Goes to the relevant Controller class routeData.Values.Add("action", action); //Goes to the relevant action method on the specified Controller routeData.Values.Add("subdomain", subdomain); //pass subdomain as argument to action method return routeData; } public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { //Implement your formating Url formating here return null; } }
像这样添加到Global.asax.cs中的路由表:
routes.Add(new SubdomainRoute());
而你的控制器方法:
public ActionResult Index(string subdomain) { //Query your database for the relevant articles based on subdomain var viewmodel = MyRepository.GetArticles(subdomain); Return View(viewmodel); }
这是我想用ASP.NET MVC做很长时间的事情,但是......这不是ASP.NET MVC负责的问题.这是服务器问题(IIS).您需要做的是允许IIS服务器上的通配符子域并将它们指向您的一个应用程序.
然后你可以用HttpContext做这样的事情:
HttpContext.Current.Request.Url.Host // user1.yourwebsite.com
然后你只需要解析它并将其推送到你认为合适的ASP.NET MVC应用程序中:
将其推入Session
更新当前路由数据并输入值
等等....
选择取决于你.
注意:这里的缺点是,这会使本地开发变得越来越困难,因此您可能想要模拟在应用程序中伪造子域的方法.