Область Поддомена Маршрутизация ASP.NET CORE - PullRequest
0 голосов
/ 03 июня 2019

Я ищу способ перенаправить определенный поддомен в область в ядре asp.net, чтобы реализация была похожа на

public class AreaRouter : MvcRouteHandler, IRouter
    {
        private readonly string[] _allowedSubdomains = { "Admin" };
        private readonly IActionContextAccessor _actionContextAccessor;
        private readonly IActionInvokerFactory _actionInvokerFactory;
        private readonly IActionSelector _actionSelector;
        private ILogger _logger;
        private DiagnosticSource _diagnosticSource;


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

        public AreaRouter(IActionInvokerFactory actionInvokerFactory, IActionSelector actionSelector, DiagnosticSource diagnosticSource,
            ILoggerFactory loggerFactory, IActionContextAccessor actionContextAccessor)
            : base(actionInvokerFactory, actionSelector, diagnosticSource,
            loggerFactory, actionContextAccessor)
        {
            _actionContextAccessor = actionContextAccessor;
            _actionInvokerFactory = actionInvokerFactory;
            _actionSelector = actionSelector;
            _diagnosticSource = diagnosticSource;
            _logger = loggerFactory.CreateLogger<MvcRouteHandler>();
        }

        public new Task RouteAsync(RouteContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            string url = context.HttpContext.Request.Headers["HOST"];
            string firstDomain = url.Split('.')[0];
            string subDomain = char.ToUpper(firstDomain[0]) + firstDomain.Substring(1);
            if (_allowedSubdomains.Contains(subDomain))
            {
                if (context.RouteData.Values.TryGetValue("area", out var area))
                {
                    if (!area.Equals(subDomain.ToLowerInvariant()))
                        context.RouteData.Values.Add("area", subDomain);
                }
                else
                {
                    context.RouteData.Values.Add("area", subDomain);
                    context.RouteData.Values["controller"] = "Dashboard";
                }
            }

            var candidates = _actionSelector.SelectCandidates(context);
            if (candidates == null || candidates.Count == 0)
            {
                return Task.CompletedTask;
            }

            var actionDescriptor = _actionSelector.SelectBestCandidate(context, candidates);
            if (actionDescriptor == null)
            {
                return Task.CompletedTask;
            }

            context.Handler = (c) =>
            {
                var routeData = c.GetRouteData();

                var actionContext = new ActionContext(context.HttpContext, routeData, actionDescriptor);
                if (_actionContextAccessor != null)
                {
                    _actionContextAccessor.ActionContext = actionContext;
                }

                var invoker = _actionInvokerFactory.CreateInvoker(actionContext);
                if (invoker == null)
                {
                    throw new InvalidOperationException();
                }

                return invoker.InvokeAsync();
            };

            return Task.CompletedTask;
        }

    }

это прекрасно работает с моей конфигурацией маршрута

app.UseMvc(routes =>
            {
                routes.DefaultHandler = areaRouter;
                routes.MapRoute("areaRoute", "{area:exists}/{controller=Dashboard}/{action=Index}/{id?}");
                routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
            });

но проблема в том, что когда я генерирую ссылки, он показывает область на URL. admin.domain.com/admin как идентифицировать область только с использованием субдомена, например, admin.domain.com, как этот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...