可以通过调用它的MapPageRoute 进行路由映射,即注册URL 模板与某个物理文件的匹配关系
/{filename}.{extension}/{pathinfo}
ContentPathSegment
PathSubsegment {} /{}{}/
PathSegment /…/
SeparatorPathSegment "/"
private static IList<PathSegment> SplitUrlToPathSegments(IList<string> urlParts)
{
List<PathSegment> list = new List<PathSegment>();
foreach (string str in urlParts) {
if (IsSeparator(str)) {
list.Add(new SeparatorPathSegment());
} else {
Exception exception;
IList<PathSubsegment> subsegments = ParseUrlSegment(str, out exception);
list.Add(new ContentPathSegment(subsegments));
}
}
return list;
}
protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
object obj2;
IRouteConstraint constraint2 = constraint as IRouteConstraint;
if (constraint2 != null) {
return constraint2.Match(httpContext, this, parameterName, values, routeDirection);
}
string str = constraint as string;
if (str == null) {
throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, System.Web.SR.GetString("Route_ValidationMustBeStringOrCustomConstraint"), new object[] { parameterName, this.Url }));
}
values.TryGetValue(parameterName, out obj2);
string input = Convert.ToString(obj2, CultureInfo.InvariantCulture);
string pattern = "^(" + str + ")$";
return Regex.IsMatch(input, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
}
可以通过HttpMethodConstraint 为路由对象设置一个允许的HTTP 方法列表,只有在这个指定的列表中的HTTP 方法名称的HTTP 请求才允许被路由
RouteExistinqFiles是否路由物理文件.路由表和每个路由中都有这个属性设置.
public RouteData GetRouteData(HttpContextBase httpContext)
{
if (httpContext == null) {
throw new ArgumentNullException("httpContext");
}
if (httpContext.Request == null) {
throw new ArgumentException(System.Web.SR.GetString("RouteTable_ContextMissingRequest"), "httpContext");
}
if (base.Count != 0) {
bool flag = false;
bool flag2 = false;
if (!this.RouteExistingFiles) {
flag = this.IsRouteToExistingFile(httpContext);
flag2 = true;
if (flag) {
return null;
}
}
using (this.GetReadLock()) {
foreach (RouteBase base2 in this) {
RouteData routeData = base2.GetRouteData(httpContext);
if (routeData != null) {
if (!base2.RouteExistingFiles) {
if (!flag2) {
flag = this.IsRouteToExistingFile(httpContext);
flag2 = true;
}
if (flag) {
return null;
}
}
return routeData;
}
}
}
}
return null;
}
如果调用AreaRegistrationContext 的MapRoute 方法是显式指定了命名空间,或者说对应的AreaRegisration 定义在某个命名空间下,这个名称为"UseNamespaceFallback" 的DataToken 元素的值为False ,反之为True 。进一步来说,如果在调用MapRoute 方法时指定了命名空间列表,那么, AreaRegistration 类型所示在的命名空间会被忽略,也就是说,后者是前者的一个后备,前者具有更高的优先级。AreaRegistration 类型所示在命名空间也不是直接作为最终RouteData 的DataTokens 中的命名空间,而是在此基础上加上" *"后缀。
public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces) { if (namespaces == null && Namespaces != null) { namespaces = Namespaces.ToArray(); } Route route = Routes.MapRoute(name, url, defaults, constraints, namespaces); route.DataTokens["area"] = AreaName; // disabling the namespace lookup fallback mechanism keeps this areas from accidentally picking up // controllers belonging to other areas bool useNamespaceFallback = (namespaces == null || namespaces.Length == 0); route.DataTokens["UseNamespaceFallback"] = useNamespaceFallback; return route; }