【MVC系列解决方案】MVC中如何自定义二级域名

来源:互联网 发布:皮蓬季后赛数据 编辑:程序博客网 时间:2024/05/16 18:08

第一步,自定义一个路由规则类 它继承Route

需要引用:

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

 public class DomainRoute : Route    {        private Regex domainRegex;        private Regex pathRegex;        public string Domain { get; set; }        public DomainRoute(string domain, string url, RouteValueDictionary defaults)            : base(url, defaults, new MvcRouteHandler())        {            Domain = domain;        }        public DomainRoute(string domain, string url, RouteValueDictionary defaults, IRouteHandler routeHandler)            : base(url, defaults, routeHandler)        {            Domain = domain;        }        public DomainRoute(string domain, string url, object defaults)            : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())        {            Domain = domain;        }        public DomainRoute(string domain, string url, object defaults, IRouteHandler routeHandler)            : base(url, new RouteValueDictionary(defaults), routeHandler)        {            Domain = domain;        }        public override RouteData GetRouteData(HttpContextBase httpContext)        {            // 构造 regex            domainRegex = CreateRegex(Domain);            pathRegex = CreateRegex(Url);            // 请求信息            string requestDomain = httpContext.Request.Headers["host"];            if (!string.IsNullOrEmpty(requestDomain))            {                if (requestDomain.IndexOf(":") > 0)                {                    requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));                }            }            else            {                requestDomain = httpContext.Request.Url.Host;            }            string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;            // 匹配域名和路由            Match domainMatch = domainRegex.Match(requestDomain);            Match pathMatch = pathRegex.Match(requestPath);            // 路由数据            RouteData data = null;            if (domainMatch.Success && pathMatch.Success)            {                data = new RouteData(this, RouteHandler);                // 添加默认选项                if (Defaults != null)                {                    foreach (KeyValuePair<string, object> item in Defaults)                    {                        data.Values[item.Key] = item.Value;                    }                }                // 匹配域名路由                for (int i = 1; i < domainMatch.Groups.Count; i++)                {                    Group group = domainMatch.Groups[i];                    if (group.Success)                    {                        string key = domainRegex.GroupNameFromNumber(i);                        if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))                        {                            if (!string.IsNullOrEmpty(group.Value))                            {                                data.Values[key] = group.Value;                            }                        }                    }                }                // 匹配域名路径                for (int i = 1; i < pathMatch.Groups.Count; i++)                {                    Group group = pathMatch.Groups[i];                    if (group.Success)                    {                        string key = pathRegex.GroupNameFromNumber(i);                        if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))                        {                            if (!string.IsNullOrEmpty(group.Value))                            {                                data.Values[key] = group.Value;                            }                        }                    }                }            }            return data;        }        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)        {            return base.GetVirtualPath(requestContext, RemoveDomainTokens(values));        }        public DomainData GetDomainData(RequestContext requestContext, RouteValueDictionary values)        {            // 获得主机名            string hostname = Domain;            foreach (KeyValuePair<string, object> pair in values)            {                hostname = hostname.Replace("{" + pair.Key + "}", pair.Value.ToString());            }            // Return 域名数据            return new DomainData            {                Protocol = "http",                HostName = hostname,                Fragment = ""            };        }        private Regex CreateRegex(string source)        {            // 替换            source = source.Replace("/", @"\/?");            source = source.Replace(".", @"\.?");            source = source.Replace("-", @"\-?");            source = source.Replace("{", @"(?<");            source = source.Replace("}", @">([a-zA-Z0-9_]*))");            return new Regex("^" + source + "$");        }        private RouteValueDictionary RemoveDomainTokens(RouteValueDictionary values)        {            Regex tokenRegex = new Regex(@"({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?");            Match tokenMatch = tokenRegex.Match(Domain);            for (int i = 0; i < tokenMatch.Groups.Count; i++)            {                Group group = tokenMatch.Groups[i];                if (group.Success)                {                    string key = group.Value.Replace("{", "").Replace("}", "");                    if (values.ContainsKey(key))                        values.Remove(key);                }            }            return values;        }    }


再添加个DomainData实体
 public class DomainData    {        public string Protocol { get; set; }        public string HostName { get; set; }        public string Fragment { get; set; }    }


然后在Global.asax文件中的RegisterRoutes注册

  

  routes.Add("刚才自定义的规则类", new DomainRoute(           "{subdomain}.您的域名.com",     // Domain with parameters            "{controller}/{action}/{id}",    // URL with parameters            new { subdomain = "", controller = "Home", action = "Index", id = "" }  // Parameter defaults           ));

如何在Control中获取域名的值
//获取二级域名
var subdomain = RouteData.Values["subdomain"].ToString();

原创粉丝点击