Субдомен MVC Custom Routing

Я пытаюсь построить маршрут субдомена «Арендатор», который присоединяется к области MVC. В этом случае у меня есть зона под названием «Арендатор», в которой есть два контроллера; Public и Admin. Мой пользовательский маршрут используется для захвата субдомена, если он совпадает, а затем направляет их в соответствующую область действий контроллера.

Основой этого проекта послужили следующиеhttp://www.matrichard.com/post/asp.net-mvc-5-routing-with-subdomain

Проблема у меня в пользовательском маршруте субдомена. Когда я ударилPublic/Index МаршрутrouteData возвращает ноль, и я вижу следующую ошибку. Хотя, если маршрут/admin он возвращает правильныйrouteData.

Ошибка сервера в приложении '/'

Совпадающий маршрут не включает значение маршрута «контроллер», которое является обязательным.

Похоже, что он всегда совпадает с использованием инструмента RouteDebugger. Это ключ к моей проблеме?

Примеры маршрутов:

Контролер = Общественная деятельность = Индекс, площадь = Арендатор

http://tenant1.mydomain.com:8080/

http://tenant1.mydomain.com:8080/logon

контроллер = действие администратора = индекс, площадь = арендатор

http://tenant1.mydomain.com:8080/admin

http://tenant1.mydomain.com:8080/admin/edit

-

SubdomainRouteP.cs

public class SubdomainRouteP : Route
{
    public string Domain { get; set; }

    public SubdomainRouteP(string domain, string url, RouteValueDictionary defaults): this(domain, url, defaults, new MvcRouteHandler())
    {
    }

    public SubdomainRouteP(string domain, string url, object defaults): this(domain, url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    {
    }

    public SubdomainRouteP(string domain, string url, object defaults, IRouteHandler routeHandler): this(domain, url, new RouteValueDictionary(defaults), routeHandler)
    {
    }

    public SubdomainRouteP(string domain, string url, RouteValueDictionary defaults, IRouteHandler routeHandler): base(url, defaults, routeHandler)
    {
        this.Domain = domain;
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        // 
        // routeData object returns null in some cases 
        // 
        var routeData = base.GetRouteData(httpContext);

        var subdomain = httpContext.Request.Url.Host.Split('.').First();

        string[] blacklist = { "www", "mydomain", "localhost" };

        // This will ignore anything that is not a client tenant prefix
        if (blacklist.Contains(subdomain))
        {
            return null; // Continue to the next route
        }

        // Why is this NULL?
        if (routeData == null)
        {

            routeData = new RouteData(this, new MvcRouteHandler());

        }

        routeData.DataTokens["Area"] = "Tenant";
        routeData.DataTokens["UseNamespaceFallback"] = bool.FalseString;
        routeData.Values.Add("subdomain", subdomain);

        // IMPORTANT: Always return null if there is no match.
        // This tells .NET routing to check the next route that is registered.
        return routeData;
    }

}

RouteConfig.cs

        routes.Add("Admin_Subdomain", new SubdomainRouteP(
            "{client}.mydomain.com", //of course this should represent the real intent…like I said throwaway demo project in local IIS
            "admin/{action}/{id}",
            new { controller = "Admin", action = "Index", id = UrlParameter.Optional }));

        routes.Add("Public_Subdomain", new SubdomainRouteP(
            "{client}.mydomain.com", //of course this should represent the real intent…like I said throwaway demo project in local IIS
            "{controller}/{action}/{id}",
            new { controller = "Public", action = "Index", id = UrlParameter.Optional }));

        // This is the MVC default Route
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional });

URL ниже дает мне следующие результаты от RouteDebugger. Во время теста 1 и 2 маршрут по-прежнему совпадает / admin.

Неудачный тест 1:http://tenant.mydomain.com/

Неудачный тест 2:http://tenant.mydomain.com/logon

Успешный 3:http://tenant.mydomain.com/admin

Соответствует Url по умолчанию

Правда admin/{action}/{id} controller = Admin, action = Index

Правда {controller}/{action}/{id} controller = Public, action = Index

Ответы на вопрос(1)

Ваш ответ на вопрос