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

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
S
Securelist
J
Java Code Geeks
Recorded Future
Recorded Future
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
S
Secure Thoughts
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
Martin Fowler
Martin Fowler
The Last Watchdog
The Last Watchdog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
O
OpenAI News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
PCI Perspectives
PCI Perspectives
N
News and Events Feed by Topic
H
Heimdal Security Blog
SecWiki News
SecWiki News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 【当耐特】
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
Netflix TechBlog - Medium
A
Arctic Wolf
The Hacker News
The Hacker News
I
Intezer
S
Schneier on Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Apple Machine Learning Research
Apple Machine Learning Research
L
Lohrmann on Cybersecurity
宝玉的分享
宝玉的分享
P
Privacy & Cybersecurity Law Blog
Stack Overflow Blog
Stack Overflow Blog
T
Tor Project blog
小众软件
小众软件
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
Jina AI
Jina AI

博客园 - 网际飞狐

异步服务框架 如何在TFS中用命令行提交更新 CollabNet Subversion 输出自定义日期格式 - 网际飞狐 - 博客园 你正确关闭WCF链接了吗? 通过OperationContext添加消息头信息 PHP在II7安装指南 [Google App Engine] Hello, world! 在IIS7中配置使用Python 2008年12月小记(NewSequentialID(),ADO.NET Data Service,Visual Studio Tips,安装Django,JQuery智能感知) [OpenAPI] html标签分析 Notes for 2008-11(GetRange, backup,file hash, PostRequest, QueryString) JS通过服务代理调用跨域服务 对硬编码WCF服务的封装(提供服务和客户端调用的封装,调用样例....) Observer Pattern, Delegate and Event How to view the W3WP process by c#? 项目框架概要 2008年10月小记(SQL删除重复记录,生成表结构,字符串特性,statistics io) WinDbg使用摘要
System.Web.Routing 使用基础
网际飞狐 · 2008-11-11 · via 博客园 - 网际飞狐

随着 ASP.NET MVC Beta 及 .net3.5 sp1 的发布,System.Web.Routing组件也正式和大家见面了。这里简单介绍一下如何使用Routing来进行URL路由(URL重写)。

假设我们要访问URL:http://localhost:4541/123456.aspx

但要求实际访问的URL:http://localhost:4541/Product.aspx?id=123456

这样我们就需要在请求URL的过程中对URL进行处理,如果使用System.Web.Routing?

1、安装.NET3.5 SP1补丁,当然你也可以直接拷贝这个组件。

2、在Web项目中引用System.Web.Routing这个组件。

3、实现IHttpHandler。我们创建一个ProductHttpHandler用以实现IHttpHandler接口,同时在实现中保存一个RequestContext对象。

    public class ProductHttpHandler : IHttpHandler
    {
        
public RequestContext RequestContext { getprivate set; }
        
public ProductHttpHandler(RequestContext context)
        {
            
this.RequestContext = context;
        }
public void ProcessRequest(HttpContext context)
        {
            
string url = string.Format("Product.aspx?id={0}", RequestContext.RouteData.Values["id"]);
            context.Server.Execute(url);
        }
public bool IsReusable { get { return false; } }

    }

注意:

#、RequestContext对象是Routing组件中的类。

#、保存了一个只能通过构造函数初始化的RequestContext对象。

#、ProcessRequest方法中构造出真实访问的URL,然后交给Server.Execute方法执行

#、通过RouteData的字典中读取实际匹配的url参数。

#、为了进行测试,需要创建一下Product.aspx页面,然后返回id参数以便于测试:

        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(Request.QueryString[
"id"]);
        }

4、实现IRouteHandler。我们在为系统的RouteCollection集中中添加Route对象需要一个实现了IRouteHandler接口的对象,所以我们创建一个这样子的实现ProductRouteHandler。

    public class ProductRouteHandler : IRouteHandler 
    {
        
public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            
return new ProductHttpHandler(requestContext);
        }
    }

实现上GetHttpHandler也没做什么事情,就是实例化一个我们刚才创建的IHttpHandler实现,实际上是要把控件权交给IHttpHandler处理。

5、在Global.asax.cs的Application_Start事件初始化路由表。

    public class Global : System.Web.HttpApplication
    {
        
public static void RegisterRoutes(RouteCollection routes)
        {
            routes.Add(
new Route("{id}.aspx"new ProductRouteHandler()));
        }
protected void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }

#、RouteTable.Routes是一个只读属性,它返回一个单件的RouteCollection集合

#、通过向RouteCollection集合中添加一系列的路由(Route)规则,来让系统自动为请求选择合适的URL指向。

6、最后,如果你创建的是一个普通的网站或者web application,这样可能没有对System.Web.Routing组行自动配置,你可以通地手动配置一下:

    <compilation debug="false">
      
<assemblies>
        
<add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35"
/>
      
</assemblies>
    
</compilation><pages>
      
<namespaces>
        
<add namespace="System.Web.Routing"/>
      
</namespaces>
    
</pages><system.web>
    
<httpModules>
      
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,
System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
 />
    
</httpModules>
  
</system.web><system.webServer>
    
<modules runAllManagedModulesForAllRequests="true">
      
<remove name="UrlRoutingModule" />
      
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,
System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
 />
    
</modules>
  
</system.webServer>

注意:添加httpmodule需要在system.web和system.webServer节中都要进行配置。

好了,现在浏览页面http://localhost:4541/123456.aspx时就会显示出123456来了。

后续:

关于正则表达式

Route也可以使用正则表达式,只有符合指定的格式的URL才可以参与到本Route的路由,把访问权交给指定的页面。

RegisterRoutes

#第一个RouteValueDictionary用于设定Route的Url模板中的参数的默认值,这个字典也可以把一些需要配置的值利用这个通道传给IHttpHandler的实现进行处理。

#第二个RouteValueDictionary用于设定参数的格式,此处使用的是正则表达式,只有合符格式的url才会被本Route处理,否则就会下移到下一下Route

此时如果访问http://localhost:4541/abc.aspx就会报404错误,访问123.aspx才能正常访问。

关于路由表顺序

从刚才的述说中可以知道,url的处理是按由上到下的顺序进行匹配的,能匹配的url就被当前的Route处理,不能匹配的url就会下移到下一个Route匹配。

所以如果我们在刚才的注册方法之前添加了一个更容易匹配的格式 这样第二个Route就永远不会执行了。

RegisterRoutes

未完成.....

#关于VirtualPath

我们如何通过程序来生成一个符合指定格式的URL,而不是通过手工构造?

#关于HttpMethodConstraint