ASP.NET核心映射子域到区域

ASP.NET核心映射子域到区域

问题描述:

我想将子域映射到区域,到目前为止,我发现的所有答案都是针对.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

如果你看看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

我有同样的问题挣扎,我设法让前加入配置服务上的我的路由器:

services.AddSingleton<AreaRouter>(); 

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

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

最后设置到位:

routes.DefaultHandler = areaRouter; 

解决这个问题让我走,但unfortunetaly我还是couldn”让子域路由按预期工作。在这一点上,似乎已经做出了路由决策。

注:我只会添加评论,但我还不能做到这一点。

编辑:完整的教程可用here。 管理您的文件的工作版本。
1.代码路由器可用here。在文件顶部的_allowedSubdomains数组中指定您自己的子域。
2.添加路由器后,在Startup.cs更改代码:通过@mepsi描述

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

areaRouter应该传递。
3.最后,允许使用描述为here的sudomains。
一切都应该现在工作。完整的代码可在Github上找到。我将在后面写出完整的教程和所有解释。