asp.net-mvc-5 – MVC5中的域路由
发布时间:2020-12-16 00:04:12 所属栏目:asp.Net 来源:网络整理
导读:我知道有一些关于类似事情的文章,但没有一篇对我有帮助. 我有一个单独的Web应用程序,其中多个域指向同一个应用程序.我想知道如何根据尝试访问Web应用程序的域将路由映射到特定控制器. 我目前尝试的是以下但没有成功. routes.MapRoute( name: "WowPoetry",url
我知道有一些关于类似事情的文章,但没有一篇对我有帮助.
我有一个单独的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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 在ASP.NET中查找重定向的原因?
- asp.net-mvc-3 – ASP.net MVC路由与可选的第一个参数
- 在ASP.Net中,在哪个页面生命周期事件中,viewstate被加载?
- Asp.net C的PDF或其他“报告查看器”选项#
- asp.net-mvc-3 – Mini Profiler不渲染脚本
- asp.net应用程序的最终用户是否需要安装.net
- asp.net – IQueryable和存储库 – 需要2?
- asp.net-core – ASP.NET Core 1.0 SynchronizationContext
- asp.net核心 – 在ASP.NET核心应用程序中使用NLog
- asp.net核心 – 在ASP.NET Core的WebDeploy期间,无法找到匹
推荐文章
站长推荐
- asp.net-mvc – 如何获取路由值在视图(Asp.net M
- asp.net – e.CommandArgument for asp按钮不工作
- asp.net – 使用Using语句的SQLConnection,从里面
- asp.net – MapRoute和MapPageRoute有什么区别?
- asp.net-core – 为什么Bind属性似乎破坏了我对嵌
- 在ASP.Net应用程序中,我可以获得请求包含哪些安全
- AOP无法切入同类调用方法解决办法
- asp.net – iis将子域重定向到同一子域的子文件夹
- asp.net-mvc – ASP.NET MVC中UpdateModel的正确
- asp.net – IIS7.5中的无扩展URL
热点阅读