Что происходит после того, как IRouteConstraint.Match возвращает false
Для мультитенантного приложения в ASP.NET MVC 5 я создал пользовательский IRouteConstraint, чтобы проверить, существует ли поддомен в базовом URL-адресе, например client1.myapplication.com или client2.application.com.
public class TenantRouteConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
string appSetting = ConfigurationManager.AppSettings[AppSettings.IsMultiTenancyEnabled];
bool isMultiTenancyEnabled = false;
bool isParsedCorrectly = bool.TryParse(appSetting, out isMultiTenancyEnabled);
if (isMultiTenancyEnabled)
{
string subdomain = httpContext.GetSubdomain();
if (subdomain != null && !values.ContainsKey("subdomain"))
{
values.Add("subdomain", subdomain);
}
return string.IsNullOrEmpty(subdomain) ? false : true;
}
else
{
return true;
}
}
}
Вот настройка маршрута:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreWindowsLoginRoute();
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "Dime.Scheduler.WebUI.Controllers" },
constraints: new { TenantAccess = new TenantRouteConstraint() }
);
}
}
Ограничение маршрута работает очень хорошо, но мне нужно лучше понять этот процесс. Я хочу знать, что именно происходит, когда этот метод ниже возвращает FALSE. Конечным результатом является ошибка HTTP 403.14 - запрещенная страница, но есть ли способ перехватить это, чтобы представить свою собственную страницу? Я обычно фиксирую эти ошибки в файле Global Asax, но в этом случае он никогда не попадает туда.
Может ли это быть связано с тем, что не будет никаких маршрутов, соответствующих запросу? Есть ли способ перенаправить на пользовательскую страницу, если совпадений не найдено?
1 ответ
После того, как любое ограничение маршрута, связанное с маршрутом, возвращает false, маршрут считается несоответствующим, и инфраструктура маршрутизации.NET проверит следующий маршрут, зарегистрированный в коллекции (сопоставление выполняется в порядке от первого маршрута до последний маршрут, который зарегистрирован в коллекции).
Конечным результатом является ошибка HTTP 403.14 - запрещенная страница, но есть ли способ перехватить это, чтобы представить свою собственную страницу?
Вы можете получить более точный контроль над маршрутизацией, наследуя RouteBase (или наследуя Route). Здесь есть довольно хороший пример доменной маршрутизации.
Ключ к этому - убедиться, что вы реализуете оба метода. GetRouteData
Здесь вы анализируете запрос, чтобы определить, соответствует ли он, и возвращаете словарь значений маршрута, если он есть (и ноль, если нет). GetVirtualPath
где вы получаете список значений маршрута, и если они совпадают, вы должны (как правило) возвращать тот же URL, который был введен в GetRouteData
метод, который соответствует. GetVirtualPath
вызывается всякий раз, когда вы используете ActionLink
или же RouteLink
внутри MVC, поэтому обычно важно обеспечить реализацию.
Вы можете определить страницу, на которую будет направлять маршрут, просто вернув правильный набор значений маршрута в GetRouteData
,