[翻译练习]关于在传统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行简单的改为如下:

var page = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(IRoutablePage)) as IHttpHandler;

 

我同时建议修改一些名字, IRoutablePage接口变为IRoutableHttpHandler接口,WebFormRouteHandler变为ClassicRouteHandler或者根据你自己的想法来修改

第二步

这一步不得不做,你必须和刚才的假定保持一致,也要和日常方案保持一致

作为补充,我快速的写了一个通用的基类和对应的接口以便允许你使用System.Web.Routing写一个自定义的Handler而不再需要到处注册了。这给了你极大的自由去连接自定义的Handler(你不得不照着示例,但我无法想象你我之外还有人懒到不愿意在Web.Config中注册,呵呵,我就是这样的,当然其中很大一部分原因是谁也不想改进运行中的Handler,不是吗?)

接口IRoutableHttpHandler应当被HTTP handler实现用来替代 IHttpHandler接口

Code

 

和Phil的 IRoutablePage 非常像(如果你根据我的建议对他的一些代码进行重命名的话)下面是我的

 

public class MySuperbadCustomHandler : IRoutableHttpHandler
{
  
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 { getset; }
  
#endregion
}

 

 上面就是一个非常傻的自定义的HTTP Handler,但也的确很清楚的告诉了你哪里该干什么(天哪,我可没这么说)

一般的Route Handler就像这样:

public class GenericHttpRouteHandler<T> : IRouteHandler
  
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 为范型,这儿是示例:

routes.Add(new Route("sweet"new GenericHttpRouteHandler<MySuperbadCustomHandler>()));

 

上面的阐述短小精悍,相信你一定能理解吧。是,还有个大问题:如果没有已知的终点,就很难去做一个基础的存取检查验证(文件或URL)。所以,大体上来说,任何人在能够访问HTTP Handler,但不能用于安全的资源,这是一个警告!

 

posted @ 2009-01-20 21:58  张柔  阅读(313)  评论(0编辑  收藏  举报