惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
The Register - Security
The Register - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
GbyAI
GbyAI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园_首页
D
Docker
S
Security @ Cisco Blogs
K
Kaspersky official blog
爱范儿
爱范儿
Simon Willison's Weblog
Simon Willison's Weblog
TaoSecurity Blog
TaoSecurity Blog
V
V2EX
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Troy Hunt's Blog
Cloudbric
Cloudbric
博客园 - 三生石上(FineUI控件)
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Hacker News
The Hacker News
美团技术团队
S
SegmentFault 最新的问题
L
Lohrmann on Cybersecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
宝玉的分享
宝玉的分享
The Last Watchdog
The Last Watchdog
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Martin Fowler
Martin Fowler
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Vercel News
Vercel News
The Cloudflare Blog
G
Google Developers Blog
T
Threat Research - Cisco Blogs
AI
AI
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
Scott Helme
Scott Helme
S
Schneier on Security
大猫的无限游戏
大猫的无限游戏
The GitHub Blog
The GitHub Blog
S
Securelist
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - Andrew Yin

数据访问层组件设计以及选型意识流 第四次扩展的讨论 数据访问层组件设计以及选型意识流 第三次封装(极致、极简而不简单) 数据访问层组件设计以及选型意识流 第二次封装以及各种牢骚 数据访问层组件设计以及选型意识流 第一次封装 数据访问层组件设计以及选型意识流 开篇 UTF-8, Unicode, GB2312三种编码方式解析, 深入研究汉字编码 C++中的模板实例:链表模板 一步一步学Ruby系列(二):Ruby中的函数 一步一步学Ruby系列(一):Ruby基础知识 .NET下的AOP: PostSharp 原理分析 AST,DLR,Expression Tree-----------推荐一位牛人的博客! C# 交互式SHELL C#中的 eval System.Web.Routing命名空间代码解析(四) Route解析中用到的实体类,一些以"Segment”为名的类 System.Web.Routing命名空间代码解析(三) RouteCollection类 System.Web.Routing命名空间代码解析(一) RouteBase类,RouteData类,RouteValueDictionary类 ASP.NET MVC中的各种上下文对象 有关string和Cookie的几个有用的扩展方法 反射加异步,根据枚举值来异步执行方法 操作Enum的一些实用方法
System.Web.Routing命名空间代码解析(二) Routing类(上)
Andrew Yin · 2008-12-05 · via 博客园 - Andrew Yin

Route类提供了五个属性,并且包装了一个ParsedRoute对象(即已解析过的Route规则),通过察看Route类的构造函数和Url属性的Set方法,我们可以知道的是:Route规则是在添加的时候就解析的,即,在Route类事例化的时候设置Url属性的时候就生成了ParsedRoute对象。

 其他的四个属性分别是 :默认值,约束规则,自带数据,处理Handler.

可以把Router类对比和RouterData类作对比。。。。

Route类的四个方法我将会在 Routing类(下)中介绍。

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using System.Web;

namespace System.Web.Routing
{
    
public enum RouteDirection
    
{
        IncomingRequest,
        UrlGeneration
    }


    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level 
= AspNetHostingPermissionLevel.Minimal),
     AspNetHostingPermission(SecurityAction.LinkDemand, Level 
= AspNetHostingPermissionLevel.Minimal)]
    
public class Route : RouteBase
    
{
        
// Fields
        private ParsedRoute _parsedRoute;
        
private string _url;
        
private const string HttpMethodParameterName = "httpMethod";

        
Constructions

        
public override RouteData GetRouteData(HttpContextBase httpContext)
        
{
            
string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2+
                                 httpContext.Request.PathInfo;
            RouteValueDictionary values 
= this._parsedRoute.Match(virtualPath, this.Defaults);
            
if (values == null)
                
return null;
            RouteData data 
= new RouteData(thisthis.RouteHandler);
            
if (!this.ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest))
                
return null;
            
foreach (KeyValuePair<stringobject> pair in values)
                data.Values.Add(pair.Key, pair.Value);
            
if (this.DataTokens != null)
                
foreach (KeyValuePair<stringobject> pair2 in this.DataTokens)
                    data.DataTokens[pair2.Key] 
= pair2.Value;
            
return data;
        }


        
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        
{
            BoundUrl url 
= this._parsedRoute.Bind(requestContext.RouteData.Values, values, this.Defaults,
                                                  
this.Constraints);
            
if (url == null)
                
return null;
            
if (!this.ProcessConstraints(requestContext.HttpContext, url.Values, RouteDirection.UrlGeneration))
                
return null;
            VirtualPathData data 
= new VirtualPathData(this, url.Url);
            
if (this.DataTokens != null)
                
foreach (KeyValuePair<stringobject> pair in this.DataTokens)
                    data.DataTokens[pair.Key] 
= pair.Value;
            
return data;
        }


        
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,
                                                                  RoutingResources.
                                                                      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);
        }


        
private bool ProcessConstraints(HttpContextBase httpContext, RouteValueDictionary values,
                                        RouteDirection routeDirection)
        
{
            
if (this.Constraints != null)
                
foreach (KeyValuePair<stringobject> pair in this.Constraints)
                    
if (!this.ProcessConstraint(httpContext, pair.Value, pair.Key, values, routeDirection))
                        
return false;
            
return true;
        }


        
// Properties
        public RouteValueDictionary Constraints getset; }

        
public RouteValueDictionary DataTokens getset; }

        
public RouteValueDictionary Defaults getset; }

        
public IRouteHandler RouteHandler getset; }

        
public string Url
        
{
            
get return (this._url ?? string.Empty); }
            
set
            
{
                
this._parsedRoute = RouteParser.Parse(value);
                
this._url = value;
            }

        }

    }

}