asp.net MVC把Areas区域绑定成二级域名
先分析需求
在MVC项目中,我们如果有两个Areas。比如Test和DEMO。我们的访问地址应该是
http://localhost:8098/test
http://localhost:8098/demo
如果我们绑定域名后想实现这样访问
http://test.abc.com:8098/
http://demo.abc.com:8098/
这个问题的相关解决办法倒是不少,比如http://www.cnblogs.com/jobily/archive/2011/10/09/2204800.html。可惜都是破坏了原来项目的结构,对于已经上线的项目不太适用。
本文的解决办法实在不破坏原来的结构之上,在原来的Areas里面重新绑定新的路由规则,重写基类路由 RouteBase的GetRouteData方法达到绑定二级域名,访问Areas的方法。
前期准备工作你需要先修改本地host文件,绑定一些二级域名。比如
127.0.0.1 demo.abc.com
127.0.0.1 test.abc.com
首先新建 AreaDomainRegistrationContext类。
- public class AreaDomainRegistrationContext
- {
- /// <summary>
- ///
- /// </summary>
- /// <param name="_domainName">子域名 如:www.xxx.com 可以传 abc</param>
- public AreaDomainRegistrationContext(AreaRegistrationContext _context, string _domainName)
- {
- domainName = _domainName; context = _context;
- }
- private string domainName; private AreaRegistrationContext context;
- private RouteCollection Routes
- {
- get
- {
- if (!DomainRouteTable.DomainRoutes.ContainsKey(domainName))
- {
- DomainRouteTable.DomainRoutes[domainName] = new RouteCollection();
- }
- return DomainRouteTable.DomainRoutes[domainName];
- }
- }
- public Route MapRoute(string name, string url, object defaults, object constraints = null, string[] namespaces = null)
- {
- if (namespaces == null && context.Namespaces != null)
- {
- namespaces = context.Namespaces.ToArray();
- }
- Route route = Routes.MapRoute(name, url, defaults, constraints, namespaces);
- route.DataTokens["area"] = context.AreaName;
- route.DataTokens["UseNamespaceFallback"] = false;
- route.DataTokens["SubDomain"] = domainName;
- return route;
- }
- }
DomainRouteTable类里面有一个静态属性DomainRoutes。主要存储域名和路由之间的存储关联。
- public class DomainRouteTable
- {
- private static Dictionary<string, RouteCollection> _instance = new Dictionary<string, RouteCollection>();
- public static Dictionary<string, RouteCollection> DomainRoutes
- {
- get
- {
- return _instance;
- }
- }
- }
下面就是重写RouteBase的类了
- public class DomainRoute : RouteBase
- {
- public ResolveDomainName resolveDomainName = DependencyResolver.Current.GetService<ResolveDomainName>();
- public RouteData d = new RouteData(null, new StopRoutingHandler());
- public override RouteData GetRouteData(HttpContextBase httpContext)
- {
- string domainName = resolveDomainName.Resolve(httpContext);
- //该主机头没有配置,返回 null 继续查找路由
- if (domainName == null) return null;
- if (!DomainRouteTable.DomainRoutes.ContainsKey(domainName)) return d;
- var rs = DomainRouteTable.DomainRoutes[domainName];
- RouteData routeData = rs.GetRouteData(httpContext);
- if (routeData == null) return d;
- return routeData;
- }
- public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
- {
- string domainName = resolveDomainName.Resolve(requestContext.HttpContext);
- if (domainName == null) return null;
- if (!DomainRouteTable.DomainRoutes.ContainsKey(domainName)) return null;
- var rs = DomainRouteTable.DomainRoutes[domainName];
- VirtualPathData vpd = rs.GetVirtualPathForArea(requestContext, values);
- return vpd;
- }
- }
ResolveDomainName主要映射Areas和域名之间的关系,可以根据Areas查找到域名。
- public class ResolveDomainName
- {
- public static Dictionary<string, string> DomainMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
- public string Resolve(HttpContextBase httpContext)
- {
- string key = httpContext.Request.Headers["host"];
- string value;
- if (DomainMap.TryGetValue(key, out value)) { return value; }
- else return null;
- }
- }
接下来在Global文件的里面的Application_Start方法里面的第一行加入一下代码
RouteTable.Routes.Add(new DomainRoute());
ResolveDomainName.DomainMap.Add("demo.abc.com:8098", "demo1");
ResolveDomainName.DomainMap.Add("test.abc.com:8098", "Test");
这样就可以绑定多个域名,后面的demo1和Test可以不和areas的名称相等,这里这是一个key而已。
接着在Areas区域里面绑定路由的地方加入一下代码
- var context2 = new AreaDomainRegistrationContext(context, "Test");
- context2.MapRoute(
- name: "Test_default",
- url: "{controller}/{action}",
- defaults: new { controller = "Home", action = "index" },
- namespaces: new string[] { "WebApplication1.Areas.Test.Controllers" });
代码看起来是这样的,这样并不影响之前的访问,还是可以通过areas的方式访问的
同理demo区域也添加代码。
接着编译我们的项目,就可以用demo.abc.com:8098来访问了,是不是很简单。
访问后的效果
本文参考文章地址
https://www.cnblogs.com/hitearth/p/6848788.html
asp.net MVC把Areas区域绑定成二级域名的更多相关文章
- ASP.NET MVC学习之模型绑定(1)
一.前言 下面我们将开始学习模型绑定,通过下面的知识我们将能够理解ASP.NET MVC模型的模型绑定器是如何将http请求中的数据转换成模型的,其中我们重点讲述的是表单数据. 二.正文 1.简单类型 ...
- 在ASP.NET MVC中使用区域来方便管理controller和view
在ASP.NET MVC中使用区域来方便管理controller和view 在mvc架构中,一般在controllers和views中写所有控制器和视图, 太多控制器时候,为了方便管理,想要将关于pe ...
- Asp.net Mvc 中的模型绑定
asp.net mvc中的模型绑定可以在提交http请求的时候,进行数据的映射. 1.没有模型绑定的时候 public ActionResult Example0() { ) { string id ...
- 000webhost虚拟主机绑定自定义二级域名
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=558 前言: 最近想给导航狗IT信息导航做一个文件服务器专门存放文件,以提供引用或下载.于是,我在000webhost上 ...
- ASP.NET MVC使用Areas后怎样获取Area(区域)的名称
写此随笔,目的只为今后在ASP.NET MVC项目中再用到Area(区域)时作为备查. 获取当前Area(区域)名称的方法是: ViewContext.RouteData.DataTokens[&qu ...
- ASP.NET MVC学习之模型绑定(2)
3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了很多过程中的控制,所以我们就需要使用手工的方式进行绑定.下面我们通过一个例子来说明,首先打开 ...
- [转]ASP.NET MVC 4 (九) 模型绑定
本文转自:http://www.cnblogs.com/duanshuiliu/p/3706701.html 模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C ...
- ASP.NET MVC 及 Areas 简单控制路由
ASP.NET MVC中怎么去控制路由,这个想关的文章很多,我在这里就是自我总结一下,仅供参考. 1.我们新建一个项目,查看RouteConfig.cs,代码如下: public static voi ...
- 如何在FineUIMvc(ASP.NET MVC)视图中绑定多个模型?
起因 这是知识星球内的一个网友提出的,按理说ASP.NET MVC中一个视图只能绑定一个模型(Model),在视图顶部标识如下: @model IEnumerable<FineUICore.Ex ...
随机推荐
- 87. Scramble String (String; DP)
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- Java学生信息增删改查(并没用数据库)
一个泛型的应用,Java版本增删改查,写的简陋,望批评指正 2016-07-02 很久前写的一个程序了.拿出来存一下,不是为了展示啥,自己用的时候还可以看看.写的很粗糙. import java.io ...
- 蚁群算法(Java)tsp问题
1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...
- Django的models介绍
我们一般会在创建表的类中写一个__str__方法,就会为为了打印这个对象不会打印一大堆的对象的内存地址,而是我们想要他返回的信息,方便我们更直观的知道这个对象是谁,方便显示.比如下面的例子 from ...
- 44-python-三维画图
https://www.cnblogs.com/xingshansi/p/6777945.html python绘制三维图 作者:桂. 时间:2017-04-27 23:24:55 链接:htt ...
- Go开发之VScode安装
1.找到官网 https://code.visualstudio.com/ 2根据自己机器环境下载 3.下载vscode地址,macos版本 https://vscode.cdn.azure.cn/s ...
- 基于KVM的qemu中宿主机和虚拟机间的通信
qga是一个运行在虚拟机内部的普通应用程序(可执行文件名称默认为qemu-ga,服务名称默认为qemu-guest-agent),其目的是实现一种宿主机和虚拟机进行交互的方式,这种方式不依赖于网络,而 ...
- kafka系列 -- 多线程消费者实现
看了一下kafka,然后写了消费Kafka数据的代码.感觉自己功力还是不够. 不能随心所欲地操作数据,数据结构没学好,spark的RDD操作没学好. 不能很好地组织代码结构,设计模式没学好,面向对象思 ...
- 处理No CPU/ABI system image for target的方法
处理No CPU/ABI system image for target的方法 最近菩提搭建完成Android开发环境后,在创建安卓模拟器的时候遇到了问题.这个问题就是图片中显示的no CPU/ABI ...
- sqlserver将数据库的数据导成excel文档方法
sqlserver将数据库的数据导成excel文档方法 最近公司需要下载uniport的数据跟之前的数据进行对比,所以避免不了需要将数据库的数据导出来,把SQLServer表中的数据导出为Excel文 ...