2017-02-17 127 views
2

我想將子域映射到區域,到目前爲止,我發現的所有答案都是針對.NET的先前版本而不是.NET核心。我發現的最好和最相關的答案是從This page。但是我在執行它時遇到問題,因爲它似乎是.NET內核的前一版本的演練,並且我收到了'MvcRouteHandler' does not contain a constructor that takes 0 arguments錯誤。ASP.NET核心映射子域到區域

下面是我從得到的錯誤代碼:

public class AreaRouter : MvcRouteHandler, IRouter //the error happens in this line, visual studio underlines the AreaRoute word 
{ 
    public new async Task RouteAsync(RouteContext context) 
    { 
     string url = context.HttpContext.Request.Headers["HOST"]; 

     string firstDomain = url.Split('.')[0]; 
     string subDomain = char.ToUpper(firstDomain[0]) + firstDomain.Substring(1); 

     string area = subDomain; 

     context.RouteData.Values.Add("area", subDomain); 

     await base.RouteAsync(context); 
    } 
} 

所以無論如何,我在尋找另一種方式來子域映射到區域或找到一種方法來解決這個錯誤。

+0

編譯器在哪一行中抱怨? – Gusman

+0

@Gusman更新了這個問題(這是第一行) – soorena12

回答

0

如果你看看MvcRouteHandler的定義,你會看到它沒有參數的構造函數,那些可獲取的是:

public MvcRouteHandler(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory); 
public MvcRouteHandler(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor); 

正如你從它繼承,則必須調用基構造,所以通常你會創建一個具有相同參數的構造函數,並把它傳遞給底座,你不需要任何額外的參數:

public AreaRouter (IActionInvokerFactory actionInvokerFactory, 
    IActionSelector actionSelector, DiagnosticSource diagnosticSource, 
    ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor) 
    : base(actionInvokerFactory, actionSelector, diagnosticSource, 
    loggerFactory, actionContextAccessor) { } 
+0

現在我收到一個錯誤''MvcRouteHandler'不包含從你寫的代碼的第四行獲取6個參數'的構造函數。除了錯誤可能會消失,我將不再能夠按照頁面的指示我得到了這段代碼,因爲我不知道在routes.DefaultHandler = new AreaRouter();中傳遞給AreaRouter的值是什麼根據指令啓動startup.cs。我會在那裏得到一個新的錯誤 – soorena12

+0

關於第一個錯誤,那是因爲.net Core的版本與我的不同,只需右鍵單擊'MvcRouteHandler',然後選擇「轉到定義」,它將打開一個元從類中向你展示類(和構造函數)的功能。而關於不能使用這些指令,這是另一個不同的問題,首先解決這個錯誤,然後開一個新的問題。 – Gusman

+0

好吧,我不是在這樣做的映射注意力,任何其他方式,這將幫助我將子域映射到區域就好了。 – soorena12

1

我有同樣的問題掙扎,我設法讓前加入配置服務上的我的路由器:

services.AddSingleton<AreaRouter>(); 

然後把它注射到配置方法有:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, AreaRouter areaRouter) 

最後設置到位:

routes.DefaultHandler = areaRouter; 

解決這個問題讓我走,但unfortunetaly我還是couldn」讓子域路由按預期工作。在這一點上,似乎已經做出了路由決策。

注:我只會添加評論,但我還不能做到這一點。

5

編輯:完整的教程可用here。 管理您的文件的工作版本。
1.代碼路由器可用here。在文件頂部的_allowedSubdomains數組中指定您自己的子域。
2.添加路由器後,在Startup.cs更改代碼:通過@mepsi描述

app.UseMvc(routes => 
     { 
     routes.DefaultHandler = areaRouter; 

areaRouter應該傳遞。
3.最後,允許使用描述爲here的sudomains。
一切都應該現在工作。完整的代碼可在Github上找到。我將在後面寫出完整的教程和所有解釋。