[翻译练习]关于在传统ASP.NET Web应用程序上面使用Routing的一些笔记
最近发现学东西有时候还是要去国外的论坛博客看看,要集思广益,但英语好多年不接触已经很差了,要加强!
随便找了个文章翻译下,练习练习,处女翻。。。
原文:Some notes on routing in classic ASP.NET web applications
翻译:
关于在传统ASP.NET Web应用程序上面使用Routing的一些笔记
.NET 3.5 SP1里面的Routing和正常的请求处理在许多方面都是不同的
下面是一些Routing如何工作的快速摘要
1.Routs定义了一些URL匹配模式,并且被放在了可以从RouteTable.Routes 很容易得到的有序序列里
2.进来的请求经过UrlRoutingModule,试图遍历整个路由表并找到一个匹配
3.如果出现一个匹配,route能够从URL中提取一些值并且将这些值存入Values属性下的RouteData对象中(事实上,还有其他的东西要被存入RouteData中,但那些都不是基本要素)
4.如果出现一个匹配,Route则去处理HTTP处理类
5.HTTP handler 要经过RouteData 并且要去处理请求
当你在传统的ASP.NET Web 应用程序里使用System.Web.Routing 时你将需要一个特殊的HTTP 处理类去使新的RouteData改变(快速提示:在处理中你可能不再需要 Request.QueryString ,因为当确定了Route Data的时候,你就能从中获取它们)。对于Web Forms你能从 Phil Haack的文章 在WebForms里使用Routing 里找到 WebFormRouteHandler这个实现,这个Phil 所写的Route Handler期望在Web页面里实现IRoutablePage接口,以便能对其中的 RequestContext起作用(步骤4-5)
但是一旦你实现了一个自定义的HTTP Handler,就会发现什么也得不到,如下:
Phil's的实现基于如下两点:
1.一个System.Web.UI.Page的派生类
2.一个注册的 http handler终点(不论是从 .ashx 文件还是来自 web.config的httpHandlers配置节点)
这儿有一个对Phil's代码的快速修正
第一步
第46行简单的改为如下:
我同时建议修改一些名字, IRoutablePage接口变为IRoutableHttpHandler接口,WebFormRouteHandler变为ClassicRouteHandler或者根据你自己的想法来修改
第二步
这一步不得不做,你必须和刚才的假定保持一致,也要和日常方案保持一致
作为补充,我快速的写了一个通用的基类和对应的接口以便允许你使用System.Web.Routing写一个自定义的Handler而不再需要到处注册了。这给了你极大的自由去连接自定义的Handler(你不得不照着示例,但我无法想象你我之外还有人懒到不愿意在Web.Config中注册,呵呵,我就是这样的,当然其中很大一部分原因是谁也不想改进运行中的Handler,不是吗?)
接口IRoutableHttpHandler应当被HTTP handler实现用来替代 IHttpHandler接口
和Phil的 IRoutablePage 非常像(如果你根据我的建议对他的一些代码进行重命名的话)下面是我的
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("I'm superbad");
}
public bool IsReusable
{
get { return false; }
}
#region IRoutableHttpHandler Members
public RequestContext RequestContext { get; set; }
#endregion
}
上面就是一个非常傻的自定义的HTTP Handler,但也的确很清楚的告诉了你哪里该干什么(天哪,我可没这么说)
一般的Route Handler就像这样:
where T : IRoutableHttpHandler, new()
{
#region IRouteHandler Members
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
T handler = new T();
handler.RequestContext = requestContext;
return handler;
}
#endregion
}
你的Route应当使用这个 handler 并且指定自定义的HTTP handler 为范型,这儿是示例:
上面的阐述短小精悍,相信你一定能理解吧。是,还有个大问题:如果没有已知的终点,就很难去做一个基础的存取检查验证(文件或URL)。所以,大体上来说,任何人在能够访问HTTP Handler,但不能用于安全的资源,这是一个警告!