ASP.NET核心映射子域到

时间:2017-02-17 01:18:40

标签: c# asp.net-core

我正在尝试将子域映射到区域,到目前为止,我找到的所有答案都是针对.NET的早期版本而不是.NET核心。我找到的最好和最相关的答案来自This page。但是我在实现它时遇到了问题,因为它似乎是.NET核心的一个以前的版本的演练,我得到了'MvcRouteHandler' does not contain a constructor that takes 0 arguments错误。

以下是我收到错误的代码:

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);
    }
}

所以无论如何,我正在寻找另一种方法将子域映射到区域或找到解决此错误的方法。

3 个答案:

答案 0 :(得分:6)

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

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

areaRouter应按@mepsi所述传递。
3.最后,允许使用所述here所述的sudomains 现在一切都应该工作了。完整代码可在Github上找到。我将在稍后编写完整的教程以及所有解释。

答案 1 :(得分:1)

我正在努力解决同样的问题,我设法通过在ConfigureServices上添加我的路由器来实现:

services.AddSingleton<AreaRouter>();

然后将其注入Configure方法:

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

最后将其设置到位:

routes.DefaultHandler = areaRouter;

解决这个问题让我前进,但不幸的是我仍然无法让子域路由按预期工作。此时似乎已经做出了路由决策。

注意:我只会添加评论,但我还不能这样做。

答案 2 :(得分:0)

如果你看一下MvcRouteHandler的定义,你会发现它没有无参数构造函数,可用的是:

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

当你继承它时,你必须调用基础构造函数,所以通常你会创建一个具有相同参数的构造函数并将它传递给基础,因为你不需要任何额外的参数: / p>

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