我知道有一些关于类似事情的文章,但没有一篇对我有帮助.
我有一个单独的Web应用程序,其中多个域指向同一个应用程序.我想知道如何根据尝试访问Web应用程序的域将路由映射到特定控制器.
我目前尝试的是以下但没有成功.
- routes.MapRoute(
- name: "WowPoetry",url: "wowpoetry.org/{action}/{id}",defaults: new { controller = "Wow",action = "Index",id = UrlParameter.Optional }
- );
解决方法
我最终遵循本教程来实现我想要的,除了我以前做域路由而不是子域路由.
Domain Routing Tutorial ASP.Net MVC
执行:
- routes.Add(new DomainRoute("wowpoetry.org","",new { controller = "Wow",action = "Index" }));
DomainData.cs
- public class DomainData
- {
- public string Protocol { get; set; }
- public string HostName { get; set; }
- public string Fragment { get; set; }
- }
DomainRoute.cs
- 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,RouteValueDictionary defaults,IRouteHandler routeHandler)
- : base(url,routeHandler)
- {
- Domain = domain;
- }
- public DomainRoute(string domain,object defaults)
- : base(url,new RouteValueDictionary(defaults),object defaults,routeHandler)
- {
- Domain = domain;
- }
- public override RouteData GetRouteData(HttpContextBase httpContext)
- {
- // Build regex
- domainRegex = CreateRegex(Domain);
- pathRegex = CreateRegex(Url);
- // Request information
- 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 domain and route
- Match domainMatch = domainRegex.Match(requestDomain);
- Match pathMatch = pathRegex.Match(requestPath);
- // Route data
- RouteData data = null;
- if (domainMatch.Success && pathMatch.Success && requestDomain.ToLower() != "tg.local" &&
- requestDomain.ToLower() != "tg.terrasynq.net" && requestDomain.ToLower() != "www.townsgossip.com" &&
- requestDomain.ToLower() != "townsgossip.com")
- {
- data = new RouteData(this,RouteHandler);
- // Add defaults first
- if (Defaults != null)
- {
- foreach (KeyValuePair<string,object> item in Defaults)
- {
- data.Values[item.Key] = item.Value;
- }
- }
- // Iterate matching domain groups
- 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;
- }
- }
- }
- }
- // Iterate matching path groups
- 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)
- {
- // Build hostname
- string hostname = Domain;
- foreach (KeyValuePair<string,object> pair in values)
- {
- hostname = hostname.Replace("{" + pair.Key + "}",pair.Value.ToString());
- }
- // Return domain data
- return new DomainData
- {
- Protocol = "http",HostName = hostname,Fragment = ""
- };
- }
- private Regex CreateRegex(string source)
- {
- // Perform replacements
- 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)
- {
- var 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;
- }
- }