先分析需求

在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区域绑定成二级域名的更多相关文章

  1. ASP.NET MVC学习之模型绑定(1)

    一.前言 下面我们将开始学习模型绑定,通过下面的知识我们将能够理解ASP.NET MVC模型的模型绑定器是如何将http请求中的数据转换成模型的,其中我们重点讲述的是表单数据. 二.正文 1.简单类型 ...

  2. 在ASP.NET MVC中使用区域来方便管理controller和view

    在ASP.NET MVC中使用区域来方便管理controller和view 在mvc架构中,一般在controllers和views中写所有控制器和视图, 太多控制器时候,为了方便管理,想要将关于pe ...

  3. Asp.net Mvc 中的模型绑定

    asp.net mvc中的模型绑定可以在提交http请求的时候,进行数据的映射. 1.没有模型绑定的时候 public ActionResult Example0() { ) { string id ...

  4. 000webhost虚拟主机绑定自定义二级域名

    作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=558 前言: 最近想给导航狗IT信息导航做一个文件服务器专门存放文件,以提供引用或下载.于是,我在000webhost上 ...

  5. ASP.NET MVC使用Areas后怎样获取Area(区域)的名称

    写此随笔,目的只为今后在ASP.NET MVC项目中再用到Area(区域)时作为备查. 获取当前Area(区域)名称的方法是: ViewContext.RouteData.DataTokens[&qu ...

  6. ASP.NET MVC学习之模型绑定(2)

    3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了很多过程中的控制,所以我们就需要使用手工的方式进行绑定.下面我们通过一个例子来说明,首先打开 ...

  7. [转]ASP.NET MVC 4 (九) 模型绑定

    本文转自:http://www.cnblogs.com/duanshuiliu/p/3706701.html 模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C ...

  8. ASP.NET MVC 及 Areas 简单控制路由

    ASP.NET MVC中怎么去控制路由,这个想关的文章很多,我在这里就是自我总结一下,仅供参考. 1.我们新建一个项目,查看RouteConfig.cs,代码如下: public static voi ...

  9. 如何在FineUIMvc(ASP.NET MVC)视图中绑定多个模型?

    起因 这是知识星球内的一个网友提出的,按理说ASP.NET MVC中一个视图只能绑定一个模型(Model),在视图顶部标识如下: @model IEnumerable<FineUICore.Ex ...

随机推荐

  1. vs2013和vs2010的配置

    win10下vs2013和vs2010的相关配置 ------made by siwuxie095 主要是推荐一些vs2013和vs2010的好用的插件和配色方案,下面主要是以vs2013示例 1.首 ...

  2. python作业(第十一周)基于RabbitMQ rpc实现的主机管理

    作业需求: 可以对指定机器异步的执行多个命令 例子: >>:run "df -h" --hosts 192.168.3.55 10.4.3.4 task id: 453 ...

  3. jsp页面遍历List<Array>与Map

    数据结构下如图所示,之前的前辈遍历方法如下,代码直接抛异常哈, <c:if test="${!empty data1}"> <c:forEach items=&q ...

  4. 最高频的K个单词 · Top K Frequent Words

    [抄题]: 给一个单词列表,求出这个列表中出现频次最高的K个单词. [思维问题]: 以为已经放进pq里就不能改了.其实可以改,利用每次取出的都是顶上的最小值就行了.(性质) 不知道怎么处理k个之外的数 ...

  5. linux 下 php 安装 ZeroMQ 扩展

    一.下载安装源码包 ZeroMQ源码包下载地址: http://zeromq.org/area:download 如:zeromq-4.1.4.tar.gz   php的zmq扩展源码包 https: ...

  6. 禁用xampp的ssl功能

    按照Disable SSL on XAMPP for Windows文章里讲解的步骤如下: 1 以管理员身份启动XAMPP控制面板,点击Config按钮打开httpd.conf 分别注释171,539 ...

  7. 20172325 2017-2018-2 《Java程序设计》第八周学习总结

    20172325 2017-2018-2 <Java程序设计>第八周学习总结 教材学习内容总结 1.关于绑定 绑定:在执行程序时产生一个请求事件,需要执行一段代码来来完成方法调用,即一个方 ...

  8. Laravel 5.5 Api

    Laravel api token验证使用方法 从 Laravel 5.2 开始, Laravel 的将路由的配置进行了分拆, 在 routes 目录下有 web.php 和 api.php 两个路由 ...

  9. 在jmeter的beanshell中用java获取系统当前时间

    import java.util.*; int y,m,d,h,mi,s; Calendar cal=Calendar.getInstance(); y=cal.get(Calendar.YEAR); ...

  10. jetty无法即时更新html、js、css等静态文件的解决办法

    网上搜了一大堆方法.最常见的是找到jetty\etc\webdefault.xml文件,找到useFileMappedBuffer参数,把true改为false <init-param> ...