• [翻译练习]关于在传统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,但不能用于安全的资源,这是一个警告!

  • 相关阅读:
    配置samba
    extern c
    剑指offer 孩子们的游戏
    剑指offer 扑克牌顺子
    剑指offer 翻转单词顺序列
    剑指offer 左旋转字符串
    mysql查看或显示当前存在多少数据库
    vim替换
    平衡二叉树
    将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
  • 原文地址:https://www.cnblogs.com/zhangrou/p/1379148.html
Copyright © 2020-2023  润新知