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邮件验证流程与配置  七夕网站制作视频,七夕大促活动怎么报名?