运用场景:企业流派网站会依据内容差别,设置差别的板块,如新浪有体育,文娱频道,等等。有的情况下须要给差别的板块设置差别的二级域名,如新浪体育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; } }
以上就是二级域名绑到特定的控制器实例教程的细致内容,更多请关注ki4网别的相干文章!