Asp.net Core MVC中怎么把二级域名绑定到特定的控制器上
发布时间 - 2026-01-11 01:53:34 点击率:次应用场景:企业门户网站会根据内容不同,设置不同的板块,如新浪有体育,娱乐频道,等等。有的情况下需要给不同的板块设置不同的二级域名,如新浪体育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中注册对应的规则,如下:
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;
}
}
以上所述是小编给大家介绍的Asp.net Core MVC中怎么把二级域名绑定到特定的控制器上,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# asp.net
# core
# mvc
# 二级域名
# ASP.NET Core MVC创建控制器与依赖注入讲解
# ASP.NET Core MVC解决控制器同名Action请求不明确的问题
# 详解如何在ASP.NET Core中编写高效的控制器
# Asp.Net Core控制器如何接收原始请求正文内容详解
# ASP.NET MVC从视图传参到控制器的几种形式
# 详解Asp.Net MVC——控制器与动作(Controller And Action)
# ASP.NET MVC从控制器传递数据到视图的四种方式详解
# Asp.net MVC中获取控制器的名称的方法
# ASP.NET中MVC从后台控制器传递数据到前台视图的方式
# ASP.NET MVC 控制器与视图
# ASP.NET MVC从控制器中获取URL值
# 的是
# 绑定
# 其他的
# 不支持
# 小编
# 器上
# 也有
# 第一个
# 在此
# 中有
# 我们可以
# 这就
# 给大家
# 欢迎大家
# 在里面
# 再去
# 会给
# 只看
# 在这种情况下
# 所述
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
活动邀请函制作网站有哪些,活动邀请函文案?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
原生JS获取元素集合的子元素宽度实例
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel如何使用模型观察者?(Observer代码示例)
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
高端建站如何打造兼具美学与转化的品牌官网?
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
昵图网官方站入口 昵图网素材图库官网入口
python中快速进行多个字符替换的方法小结
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
网站制作软件免费下载安装,有哪些免费下载的软件网站?
如何用免费手机建站系统零基础打造专业网站?
使用C语言编写圣诞表白程序
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
iOS正则表达式验证手机号、邮箱、身份证号等
青岛网站建设如何选择本地服务器?
如何在阿里云香港服务器快速搭建网站?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何快速搭建自助建站会员专属系统?
C#如何调用原生C++ COM对象详解
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
如何正确下载安装西数主机建站助手?
如何在IIS管理器中快速创建并配置网站?
如何登录建站主机?访问步骤全解析
Python自动化办公教程_ExcelWordPDF批量处理案例
如何在云主机快速搭建网站站点?
如何挑选优质建站一级代理提升网站排名?
iOS中将个别页面强制横屏其他页面竖屏
Python制作简易注册登录系统
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
如何在万网ECS上快速搭建专属网站?
香港服务器选型指南:免备案配置与高效建站方案解析
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
七夕网站制作视频,七夕大促活动怎么报名?

