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

Soo*_*ban 5 c# asp.net-core

我试图将子域映射到区域,到目前为止,我找到的所有答案都是针对.NET的早期版本而不是.NET核心.我找到的最好和最相关的答案来自此页面.但是我在实现它时遇到了问题,因为它似乎是.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*lyk 6

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

app.UseMvc(routes =>
       {
       routes.DefaultHandler = areaRouter;
Run Code Online (Sandbox Code Playgroud)

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


Gus*_*man 0

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

public MvcRouteHandler(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory);
public MvcRouteHandler(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource, ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor);
Run Code Online (Sandbox Code Playgroud)

当您继承它时,您必须调用基本构造函数,因此通常您会创建一个具有相同参数的构造函数并将其传递给基本构造函数,因为您不需要任何额外的参数:

    public AreaRouter (IActionInvokerFactory actionInvokerFactory,
    IActionSelector actionSelector, DiagnosticSource diagnosticSource,
    ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor)
    : base(actionInvokerFactory, actionSelector, diagnosticSource,
    loggerFactory, actionContextAccessor) { }
Run Code Online (Sandbox Code Playgroud)