科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在ASP.NET中实现Url Rewriting(三)

在ASP.NET中实现Url Rewriting(三)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

其中type属性为HttpModule的标识号和类库名称,name属性则为该模块取一个较为友好的名称方便 在Global.asax调用。

作者:中国IT实验室 来源:中国IT实验室 2007年8月31日

关键字: Rewriting URL ASP.NET

  • 评论
  • 分享微博
  • 分享邮件
其中type属性为HttpModule的标识号和类库名称,name属性则为该模块取一个较为友好的名称方便 在Global.asax调用。
HttpHandlerHttpHandlerFactory则是 在web.config文件中configuration\System.Web节中添加<httpHandler>标记,例如:

<httpHandlers>
<add verb="verb" path="path" type="type" />
</HttpModules>

  回忆上文, ASP.NET对每一个接收到的请求指派相应的HttpHandler来处理并呈现相应内容,该指派决定于所接收请求的verb和path的内容,verb为HTTP请求的类型:GET或者POST,path则为请求的文件的路径和文件名。如果我们打算用一个HttpHandler来处理所有GET类型和POST类型的并且文件扩展名为.scott的内容,可以在web.config相应配置节中加入下列标记:

<httpHandlers>
<add varb="*" path=".scott" type="type" />
</httpHandlers>

  其中 type是我们定义的HttpHandler的类型。

  注意:在注册HttpHandler的时候必须注意HttpHandler所使用的文件扩展名必须已经在IIS中做指向ASP.NET引擎的映射,在上面.scott扩展名的例子中,如果我们所使用的.scott扩展名如果没有在IIS中做指向ASP.NET引擎的映射的话,假定对foo.scott文件发出请求,该请求 将导致IIS将foo.scott文件内容直接呈现给客户端,为了能够让HttpHandler处理该请求,必须将.scott扩展名在IIS中做指向ASP.NET引擎的映射,之后IIS才能正确地将.scott的请求转交给相应的HttpHandler

  实现网址重写

  网址重写技术不但可以在IIS Web服务器一级通过ISAPI过滤器实现,而且还可以在ASP.NET一级通过HttpModule或者HttpHandler实现。本文主要关注在ASP.NET一级实现网址重写技术,所以此时不必关注在ISAPI应用程序中实现网址重写的技术细节,而且有很多第三方厂商提供的ISAPI过滤器。

  构建网址重写引擎

  在ASP.NET中实现网址重写很简单, 只需调用System.Web.HttpContext类的RewritePath()方法即可。HttpContext类中包含有关于特定HTTP请求的HTTP规范信息。ASP.NET引擎每接收到一个特定请求后便针对该请求创建一个特定的实例,这个类包含一些属性诸如: RequestResponse属性,分别提供对请求和响应的访问;ApplicationSession属性提供对Application变量和Session变量的访问;User属性提供对已授权用户信息的访问。

  在微软.NET Framework 1.0版本中,RewritePath()方法接收一个新路径的简单字符串,在其内部HttpContext类的RewritePath(string)方法内在地更新Request对象的路径和查询参数。除了RewritePath(string)方法之外,.NET Framework 1.1版还提供了另外一些重载版本,其中一个重载版本接收三个输入字符串参数,这种交替的重载形式不仅仅只是设置Request对象的路径和查询参数这些属性,而是设置更深层的成员变量,这些成员变量用于为 PhysicalPathPathInfoFilePath属性计算Request对象值。

  为了实现ASP.NET中的网址重写,我们需要创建一个HttpHandlerHttpModule用于:

  ·根据请求的路径决定所需要重写的路径;

  ·重写路径,如果需要的话可以调用RewritePath方法;

  以前文所构建的那个站点为例,可以通过/info/employee.aspx?empID=EmployeeID来访问每一个雇员的信息。为了使这个网址更加地具有“隐蔽性”,我们可能会使用更加容易理解的访问方式如:/people/雇员名.aspx。这里就有了一个网址重写的案例:当接收到对/people/ScottMitchell.aspx的请求的时候,我们就得使用网址重写使得对该页面的请求被重写指向到先前使用的/info/employee?EmpID=1001地址。

  使用HttpModule来调用网址重写

  在ASP.NET一级来执行网址重写,既可以使用HttpHandler,也可以使用HttpModule。当使用HttpModule的时候,必须决定如果该网址需要被重写的话,究竟应该在整个请求的生命周期期间的那一个点来使用。乍一看着有些武断,但是这个决定以重大而且微妙的方式影响到你的应用程序。之所以作出对网址重写点的选择是因为内嵌的ASP.NET HttpModule使用Request对象的属性值来完成自己的工作(回忆一下重写路径对Request对象的属性值的改变),这些内嵌HttpModule和相应事件的密切关系列举如下:

HttpModule 事件 简介
FormsAuthenticationModule AuthenticateRequest 判断用户是否已通过表单授权方式获取授权,如果没有的话则将用户重定向到指定的登录页面
FileAuthorizationModule AuthorizeRequest 当使用Windows授权方式的时候,该HttpModule判断并确定该Microsoft Windows帐户是否对其请求的资源拥有足够的权限
UrlAuthorizationModule AuthorizeRequest 检查并确认请求者是否对所访问的网址拥有权限。该Url授权可以在web.config文件的<authorization>和<location>元素中配置


  回想一下BeginRequest事件在AuthenticateRequest事件之前引发,而AuthenticateRequest事件又在AuthorizeRequest事件之前引发。

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章