mvc的subdomain实现深入研究

2012-02-06

因为要实现用户注册自定义域名,类似淘宝这样,所以必须实现mvc的route相关类

第一种通过修改host文件和添加路由来实现自定义二级域名

参考文章:http://hanssens.org/post/ASPNET-MVC-Subdomain-Routing.aspx

1.新建一个mvc3项目,添加subdomain处理代码

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace domain1.DomainRoute
{
    public class SubdomainRoute : RouteBase
    {
        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            RouteData returnValue = null;

            // Retrieve the url - and split by dots:
            var url = httpContext.Request.Headers["HOST"];
            var index = url.IndexOf(".");

            // Determine if a subdomain is provided:
            if (index < 0)
                return returnValue;

            // Get the subdomain (as a string):
            string subDomain = url.Substring(0, index);

            // switch through each possible subdomain:
            switch (subDomain.ToLowerInvariant())
            {
                case "develop":
                    returnValue = new RouteData(this, new MvcRouteHandler());
                    returnValue.Values.Add("controller", "Home");
                    returnValue.Values.Add("action", "Index");
                    returnValue.Values.Add("liveMode", false); // set parameter to 'false';
                    break;
                case "live":
                    returnValue = new RouteData(this, new MvcRouteHandler());
                    returnValue.Values.Add("controller", "Home");
                    returnValue.Values.Add("action", "Index");
                    returnValue.Values.Add("liveMode", true); // set parameter to 'true';
                    break;
                default: // not a supported domain, return null;
                    break;
            }

            return returnValue;
        }

        /// <summary>
        /// Required override. Just return null ;)
        /// </summary>
        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            return null;
        }
    }
}

2.配置路由

// Register the custom routing class:
            routes.Add(new SubdomainRoute());
            // Add the controller:
            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", liveMode = false }
            );

3.定义action ,在HomeController里修改

public ActionResult Index(bool? liveMode)
        {
            if (liveMode != null && liveMode.Value)
                ViewBag.connection="Live connection";
            else
                ViewBag.connection= "Develop connection";

            return View();
        }

4.修改视图

<p>Connection type: <strong>@ViewBag.connection</strong></p>

5.在%WINDIR%\system32\drivers\etc\ 修改host文件

增加

127.0.0.1     develop.localhost 
127.0.0.1     live.localhost

6.在浏览器中运行http://develop.localhost/就可以看到你想要的结果了

示例源码下载:http://www.jqpress.com/upfiles/201202/subdomain1.rar

这只是刚开始,离实现自定义域名还有很多工作要做

作者:robotbird, 分类:关于代码 标签: donet mvc , 浏览(4465), 评论(3)
上一篇: 在iis中调试.net代码,附加到进程w3wp.exe
下一篇: 从今天开始坚持不刷技术类文章

相关文章

(3)条评论 订阅

  1. ${item.nickname} 币安网 说:

    通过修改host文件和添加路由来实现自定义二级域名。

  2. ${item.nickname} 火牛视频 说:

    说的不错,很好啦。

  3. 不错喔!!!

1

发表评论

电子邮件用于回复通知和avatar全球唯一头像 *

*