asp.net core mvc中如何把二级域名绑定到特定的控制器上

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

  应用场景:企业门户网站会根据内容不同,设置不同的板块,如新浪有体育,娱乐频道,等等。有的情况下需要给不同的板块设置不同的二级域名,如新浪体育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();                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中如何把二级域名绑定到特定的控制器上的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2494169.html

(0)
上一篇 2025年3月5日 01:46:53
下一篇 2025年3月5日 01:47:07

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 用Photoshop制作1寸照片的实现方法

    问: 平时用的小1吋、小2吋照片是多大的?在电脑上如何选择? 需要电子版的照片,可是用数码相机拍的太大,不知用什么软件可以修改? 答: 一寸 2.5*3.5cm 600*400以上 小两寸3.3*4.8cm 600*400以上 两寸 3.5…

    2025年4月1日 编程技术
    100
  • Photoshop照片曝光修复教程

    书籍和杂志上专业摄影师所拍摄的照片看起来都很棒,但有时这些图像与圣诞节在家中拍摄的照片或者在去迪斯尼乐园的旅途中所拍摄的照片看起来有很大差别。   如果在闪光灯未激发时拍摄完美的albert大叔的图像,或者孩子在黄昏与米老鼠玩耍时需要拍摄一…

    2025年4月1日 编程技术
    100
  • Photoshop入门:自定义形状如何使用?

     继续前面的教程,Photoshop入门:外部图案的安装和使用,讲解自定义形状工具的使用。1,首先打开photoshop,选择工具箱中的自定义形状工具如图1 2,在最上面的属性栏如图2所示点小三角形选择“载入形状” 3,选择你要载入的形状文…

    2025年4月1日 编程技术
    100
  • Photoshop入门:下载的笔刷如何使用?

    网上有许多精彩的photoshop笔刷供大家下载,可是有很多朋友还不太会用,下面我们就来看看怎么安装和使用photoshop笔刷。 先把解压后的photoshop笔刷文件放在一个文件夹内方便等会安装使用,记住文件所在的路径。 1.打开pho…

    2025年4月1日 编程技术
    100
  • PS入门:如何使用网上下载的笔刷?

    网上有许多精彩的photoshop笔刷供大家下载,可是有很多朋友还不太会用,下面我们就来看看怎么安装和使用photoshop笔刷。先把解压后的photoshop笔刷文件放在一个文件夹内方便等会安装使用,记住文件所在的路径。打开photosh…

    2025年4月1日 编程技术
    100
  • Photoshop入门:如何调用下载的外挂插件

    很多初学者下载了一些字体、笔刷、滤镜、形状、动作、样式等等,这些都称之为外挂插件(简称:外插、或外挂),解压后不知如何使用,这里给大家用图示解说一下,希望对你有所帮助。 1、下载字体的使用方法: 把下载的字体默认安装到电脑系统盘的windo…

    2025年4月1日 编程技术
    100
  • 如何在PS中创建精密到1个像素的蒙板?

       蒙板是photoshop提供的一个功能强大的区域选取方法,它通过一个256级的灰度图像来控制一个选取区域。今天我们要告诉你如何在photoshop中创建精密到1个像素(pixel)的蒙板。   比如我们要通过制作蒙板使得我们可以选取人…

    编程技术 2025年4月1日
    100
  • Photoshop CS3教程:如何制作动画

     动画形成原理是因为人眼有视觉暂留的特性,所谓视觉暂留就是在看到一个物体后,即时该物体快速消失,也还是会在眼中留下一定时间的持续影像,这在物体较为明亮的情况下尤为明显。最常见的就是夜晚拍照时使用闪光灯,虽然闪光灯早已熄灭,但被摄者眼中还是会…

    2025年4月1日 编程技术
    100
  • 什么是html文件?又如何打开html文件

    html即超文本标记语言,现在大部分网页都是html格式,所以应用非常广泛,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。接下来通过本文给大家分享html文件打开方法,需要的的朋友参考下    html即超文本标记语…

    2025年4月1日
    100
  • 什么是实时通信的Web?

    ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信。 什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的。 Web…

    2025年4月1日
    100

发表回复

登录后才能评论