首頁 後端開發 C#.Net教程 asp.net core mvc中如何把二級網域綁定到特定的控制器上

asp.net core mvc中如何把二級網域綁定到特定的控制器上

Jun 26, 2017 pm 03:19 PM
asp.net core 二級域名 如何 綁定

  由於公司的工作安排,一直在研究其他技術,所以一直沒時間更新博客,今天終於可以停下手頭的事情,寫一些新內容了。

  應用場景:企業入口網站會根據內容不同,設定不同的板塊,如新浪有體育,娛樂頻道,等等。有的情況下需要為不同的板塊設置不同的二級域名,如新浪體育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中如何把二級網域綁定到特定的控制器上的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1658
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1231
24
如何在 Windows 11 中啟用 Core Isolation 的記憶體完整性功能 如何在 Windows 11 中啟用 Core Isolation 的記憶體完整性功能 May 10, 2023 pm 11:49 PM

Microsoft的Windows112022Update(22H2)預設啟用CoreIsolation的記憶體完整性保護。但是,如果您執行的是舊版的作業系統,例如Windows112022Update(22H1),則需要手動開啟此功能。在Windows11中開啟CoreIsolation的記憶體完整性功能對於不了解核心隔離的用戶,這是一個安全過程,旨在透過將Windows上的基本核心活動隔離在記憶體中來保護它們免受惡意程式的侵害。此進程與記憶體完整性功能結合,可確保

兩張微信可以綁定同一張銀行卡嗎 兩張微信可以綁定同一張銀行卡嗎 Aug 25, 2023 pm 03:13 PM

兩個微信不可以綁定同一張銀行卡。綁定銀行卡到微信帳戶操作:1、打開微信應用程序,點擊“我”選項,然後選擇“支付”選項;2、選擇“添加銀行卡”選項,並按照系統提示輸入銀行卡信息;3、一旦銀行卡綁定成功,用戶就可以在微信中使用該銀行卡進行付款和轉帳。

如何在Vue中實作可編輯的表格 如何在Vue中實作可編輯的表格 Nov 08, 2023 pm 12:51 PM

在許多Web應用程式中,表格是必不可少的一個元件。表格通常具有大量數據,因此表格需要一些特定的功能來提高使用者體驗。其中一個重要的功能是可編輯性。在本文中,我們將探討如何使用Vue.js實作可編輯的表格,並提供具體的程式碼範例。步驟1:準備資料首先,我們需要為表格準備資料。我們可以使用JSON物件來儲存表格的數據,並將其儲存在Vue實例的data屬性中。在本例中

電腦core是什麼意思 電腦core是什麼意思 Sep 05, 2022 am 11:24 AM

電腦中core有兩種意思:1、核心,也即內核,是CPU最重要的組成部分,CPU所有的運算、接受儲存指令、處理資料都由核心執行;2、酷睿,core是英特爾的處理器名稱,酷睿是英特爾公司繼奔騰處理器之後推出的處理器品牌,目前已經發布了十二代酷睿處理器。

BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? Apr 26, 2024 am 09:40 AM

MetaMask(中文也叫小狐狸錢包)是一款免費的、廣受好評的加密錢包軟體。目前,BTCC已支援綁定MetaMask錢包,綁定後可使用MetaMask錢包進行快速登錄,儲值、買幣等,且首次綁定還可獲得20USDT體驗金。在BTCCMetaMask錢包教學中,我們將詳細介紹如何註冊和使用MetaMask,以及如何在BTCC綁定並使用小狐狸錢包。 MetaMask錢包是什麼? MetaMask小狐狸錢包擁有超過3,000萬用戶,是當今最受歡迎的加密貨幣錢包之一。它可免費使用,可作為擴充功能安裝在網絡

小紅書怎麼綁定子帳號?它怎麼檢測帳號是否正常? 小紅書怎麼綁定子帳號?它怎麼檢測帳號是否正常? Mar 21, 2024 pm 10:11 PM

在現今這個資訊爆炸的時代,個人品牌和企業形象的建立變得越來越重要。小紅書作為國內領先的時尚生活分享平台,吸引了大量用戶關注和參與。對於那些希望擴大影響力、提高內容傳播效率的使用者來說,綁定子帳號成為了一種有效的手段。那麼,小紅書怎麼綁定子帳號呢?又如何檢測帳號是否正常呢?本文將為您詳細解答這些問題。一、小紅書怎麼綁定子帳號? 1.登入主帳號:首先,您需要登入您的小紅書主帳號。 2.開啟設定選單:點選右上角的“我”,然後選擇“設定”。 3.進入帳號管理:在設定選單中,找到「帳號管理」或「帳號助理」選項,點

今日頭條綁定抖音的步驟方法 今日頭條綁定抖音的步驟方法 Mar 22, 2024 pm 05:56 PM

1、打開今日頭條。 2、點選右下角我的。 3.點選【系統設定】。 4.點選【帳號和隱私設定】。 5.點選【抖音】右邊的按鈕即可綁定抖音。

菜鳥app怎麼綁定拼多多 菜鳥裹裹怎麼添加拼多多平台 菜鳥app怎麼綁定拼多多 菜鳥裹裹怎麼添加拼多多平台 Mar 19, 2024 pm 02:30 PM

菜鳥app就是能夠提供你們各種物流資訊狀況的平台,這裡的功能非常的強大好用,大家有任何與物流相關的問題,都能在這得到解決的,反正都能為你們帶來一站式的服務,全都能及時解決的,查快遞,取快遞,寄快遞等,都是毫無任何問題,與各個的平台都進行了合作,全部的信息,都能查詢得到的,但是有些時候會出現拼多多當中購買的商品,都是無法呈現出物流的信息,其實是需要大家進行手動綁定拼多多,才能實現的,具體的方法已經整理出來了在下方,大家都能來看看的。菜鳥綁定拼多多帳戶的方法:  1、打開菜鳥APP,在主頁面

See all articles