由于公司的工作安排,一直在研究其他技术,所以一直没时间更新博客,今天终于可以停下手头的事情,写一些新内容了。

  应用场景:企业门户网站会根据内容不同,设置不同的板块,如新浪有体育,娱乐频道,等等。有的情况下需要给不同的板块设置不同的二级域名,如新浪体育sports.sina.com.cn。

  在asp.net core mvc中,如果要实现板块的效果,可能会给不同的板块建立不同的控制器(当然也有其他的技术,这里不讨论实现方式的好坏),在这种情况下,如何给控制器绑定上独有的二级域名,比如体育频道对应的控制器叫SportController,通过sports.XXX.com域名访问系统的时候,直接进入SportController,并且通过这个二级域名无法访问其他的控制器。

  上面说完场景了,下面来看下如何实现。

  在asp.net core mvc中有路由规则配置,配置的地方在Startup.Configure方法中,具体代码如下:

  

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}",
defaults: new { area="admin"});
});

  遗憾的是不支持对域名的支持(我目前了解的是,如果有问题,欢迎大家指正)。通过routes.MapRouter注册路由规则,并加入到RouteCollection中,当某个请求过来后,RouterCollection循环所有注册好的IRouter对象,找到第一个匹配的IRouter为止。虽然框架不支持域名配置规则,但是我们可以自己去实现一个IRouter,在里面实现二级域名判断的逻辑,我这里暂时起名为SubDomainRouter,具体实现代码如下:

  public class SubDomainRouter : RouteBase
{
private readonly IRouter _target;
private readonly string _subDomain;
public SubDomainRouter(
IRouter target,
string subDomain,//当前路由规则绑定的二级域名
string routeTemplate,
RouteValueDictionary defaults,
RouteValueDictionary constrains,
IInlineConstraintResolver inlineConstraintResolver)
: base(routeTemplate,
subDomain,
inlineConstraintResolver,
defaults,
constrains,
new RouteValueDictionary(null))
{
if (target == null)
{
throw new ArgumentNullException(nameof(target));
}
if (subDomain == null)
{
throw new ArgumentNullException(nameof(subDomain));
}
_subDomain = subDomain;
_target = target;
}
public override Task RouteAsync(RouteContext context)
{
string domain = context.HttpContext.Request.Host.Host;//获取当前请求域名,然后跟_subDomain比较,如果不想等,直接忽略 if (string.IsNullOrEmpty(domain) || string.Compare(_subDomain, domain) != 0)
{
return Task.CompletedTask;
}
        
       //如果域名匹配,再去验证访问路径是否匹配 return base.RouteAsync(context); } protected override Task OnRouteMatched(RouteContext context)
{
context.RouteData.Routers.Add(_target);
return _target.RouteAsync(context);
} protected override VirtualPathData OnVirtualPathGenerated(VirtualPathContext context)
{
return _target.GetVirtualPath(context);
}
}

  从上面的代码我们只看到了域名检测,但是如何把域名定向到特定的控制器上,这就需要我们在注册这个IRouter的时候做些文章,直接上代码:

public static class RouteBuilderExtensions
{
public static IRouteBuilder MapDomainRoute(
this IRouteBuilder routeBuilder,string domain,string area,string controller)
{
if(string.IsNullOrEmpty(area)||string.IsNullOrEmpty(controller))
{
throw new ArgumentNullException("area or controller can not be null");
}
var inlineConstraintResolver = routeBuilder
.ServiceProvider
.GetRequiredService<IInlineConstraintResolver>(); string template = ""; RouteValueDictionary defaults = new RouteValueDictionary();
RouteValueDictionary constrains = new RouteValueDictionary();
constrains.Add("area", area);
defaults.Add("area", area);
constrains.Add("controller", controller);
defaults.Add("controller", string.IsNullOrEmpty(controller) ? "home" : controller);
defaults.Add("action", "index"); template += "{action}/{id?}";//路径规则中不再包含控制器信息,但是上面通过constrains限定了查找时所要求的控制器名称
routeBuilder.Routes.Add(new SubDomainRouter(routeBuilder.DefaultHandler, domain, template, defaults, constrains, inlineConstraintResolver)); return routeBuilder;
}
}

  最后我们就可以在Startup中注册对应的规则,如下:

app.UseMvc(
routes =>
{
routes.MapDomainRoute("xxx.domain.com","areaname","controllername"); routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}",
defaults: new { area = "web" });
});

  实现方法可能不是最好的,但是已经满足了基本需求,如果大家有更好的方法,欢迎讨论交流。

  

  

  

asp.net core mvc中如何把二级域名绑定到特定的控制器上的更多相关文章

  1. .Net Core 二级域名绑定到指定的控制器

    在说二级域名绑定之前,先说一下.net core中的区域,关于区域这一块儿在很久之前的博客中,已经提过,详见<03-dotnet core创建区域[Areas]及后台搭建>,在这篇博客中, ...

  2. ASP.NET Core MVC 中的 [Controller] 和 [NonController]

    前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...

  3. ASP.NET Core MVC 中设置全局异常处理方式

    在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...

  4. 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】

    Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...

  5. 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】

    Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...

  6. ASP.NET Core MVC中的 [Required]与[BindRequired]

    在开发ASP.NET Core MVC应用程序时,需要对控制器中的模型校验数据有效性,元数据注释(Data Annotations)是一个完美的解决方案. 元数据注释最典型例子是确保API的调用者提供 ...

  7. ASP.NET Core MVC中构建Web API

    在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能. 在成功构建 ASP.NET CORE MVC项目之后,选中解决方案,先填加一个API的文 ...

  8. 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】

    Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Changing vi ...

  9. 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行

    我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...

随机推荐

  1. <2014 04 26> 《Coders at Work编程人生:15位软件先驱访谈录》

    什么是老派程序员?调试只用printf,关心数据结构,先整体或先局部,不知道OO.IDE.TDD.BDD等等为何物.Ken Thompson,Jamie Zawinski,Joe Armstrong, ...

  2. 正则表达式 \b

    引用网上一段话: \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处.虽然通常英文的单词是由空格,标点符号或者换行来 ...

  3. Matlab/Simulink仿真中如何将Scope转化为Figure?

    1.只需要在运行仿真后,在命令窗口内输入: ,'ShowHiddenHandle','on'); set(gcf,'menubar','figure'); scope最上方会出现一个菜单栏,选择Too ...

  4. Windows下QT MySQL驱动编译

    在Windows环境中使用Qt进行关于MySQL数据库的操作时,会出现如下问题: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: availa ...

  5. C# 调用win api获取chrome浏览器中地址

    //FindWindow 查找窗口 //FindWindowEx查找子窗口 //EnumWindows列举屏幕上的所有顶层窗口,如果回调函数成功则返回非零,失败则返回零 //GetWindowText ...

  6. 《深度学习》Textbook第十章学习笔记

    深度学习 第10章 序列建模:循环和递归网络 1.循环神经网络介绍 相比卷积神经网络:专门用于处理网格化的数据(如图像),可以很容易扩展到更具有很大宽度和高度的图像,以及处理大小可变的图像: 循环神经 ...

  7. 浅析造成 JS 内存泄露的几种原因及解决方案

    内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束.在C++中,因为是手动管理内存,内存泄露是经常出现的事情.而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使 ...

  8. linux查看某个端口被哪个程序占用

    查看某个端口被哪个程序占用 netstat  -anp  |grep   端口号 查看进程号对应的程序 ps -ef | grep 17997 查看指定端口号的进程情况 netstat -tunlp

  9. Android位置权限以及数组寻找索引的坑

    填坑与求解惑来的. 一.Android 危险权限,来自官方文档的坑??? Android开发者都知道,Android 6.0 之前,权限申请只需要在 AndroidManifest.xml 文件中声明 ...

  10. 利用同步网盘搭建个人或团队SVN服务器

    这篇文章是以前写的,现在强烈推荐两个站.1.http://git.oschina.com 2.http://www.coding.net. 推荐理由:1.可创建私有项目.2.免费稳定.3.VS2013 ...