摘要:介绍如何使用 Microsoft ASP.NET 执行动态 URL 重写。URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。讨论实现 URL 重写的各种技术,并介绍执行 URL 重写的一些实际情况。

引言让我们花点时间来看一下网站上的一些 URL。您是否发现一些类似于 http://www.51aspx.com/info/dispEmp%20...%20pID=459-099&;type=summary 的 URL?或者,您可能将一系列网页从一个目录或网站移动到另一个目录或网站,结果导致已将旧 URL 用作书签的访问者断开链接。在本文中,我们将了解如何通过将 http://51aspx.com/CV/UrlReWriter//dispEmp ... pID=459-099&;type=summary 替换为类似于 http://51aspx.com/CV/UrlReWriter/ 的网址,使用 URL 重写将那些冗长的 URL 缩写为富有意义且容易记忆的 URL。我们还将了解如何将 URL 重写用于创建智能 404 错误。
URL 重写是截取传入 Web 请求并自动将请求重定向到其他资源的过程。执行 URL 重写时,通常会检查被请求的 URL,并基于 URL 的值将请求重定向到其他 URL。例如,在进行网站重组而将 /people/ 目录下的所有网页移动到 /info/employees/ 目录中时,您可能希望使用 URL 重写来检查 Web 请求是否指向了 /people/ 目录中的文件。如果请求指向 /people/ 目录中的文件,您可能希望自动将请求重定向到 /info/employees/ 目录中的同一文件。
使用传统的 ASP,应用 URL 重写的唯一方法是编写 ISAPI 筛选器,或者购买提供 URL 重写功能的第三方产品。但是,使用 Microsoft® ASP.NET,您可以通过很多方法来轻松地创建您自己的 URL 重写软件。本文讨论了可供 ASP.NET 开发人员实现 URL 重写的各种技术,然后讨论了 URL 重写的一些实际使用情况。在深入讨论 URL 重写的技术细节之前,让我们先看一些可以使用 URL 重写的日常情景。
返回页首

URL 重写的常见用法创建数据驱动的 ASP.NET 网站时,通常会产生一个单个的网页,该网页基于查询字符串参数显示数据库数据的子集。例如,在设计电子商务站点时,您的任务之一便是允许用户浏览待售产品。为此,您可以创建一个名为 displayCategory.aspx 的页面,该页面将显示给定类别的产品。可以通过查询字符串参数来指定要查看的该类别的产品。也就是说,如果用户要浏览待售的 Widget 产品,并且所有 Widget 产品的 CategoryID 均为 5,则用户可以访问以下网址:http://51aspx.com/CV/UrlReWriter/displayCategory.aspx?CategoryID=5。
创建具有此类 URL 的网站有两点不足:首先,从最终用户的角度考虑,URL http://51aspx.com/CV/UrlReWriter/displayCategory.aspx?CategoryID=5 比较杂乱。可用性专家 Jakob Neilsen 建议遵循以下标准来选择 URL:

  • 简短。
  • 易于键入。
  • 可以看出站点的结构。
  • “可删节”,允许用户通过删除 URL 的组成部分来浏览站点。

我还要增加一条标准,即,URL 应该便于记忆。URL http://yousite.com/displayCategory.aspx?CategoryID=5 不符合 Neilsen 的任何标准,也不容易记住。要求用户键入查询字符串值将使 URL 的键入变得非常困难,并且只有了解查询字符串参数的用途及其名称/值对结构的富有经验的 Web 开发人员才能够对 URL 进行“删节”。
较好的方法是允许使用切合实际且容易记忆的 URL,如 http://51aspx.com/CV/UrlReWriter/。只要看一眼 URL,您便可以推断出将要显示的内容 -- 有关 Widget 的信息。此 URL 也很容易记住和共享。我可以告诉我的同事“请查看 yoursite.com/products/Widgets,”,她可能无需再次问我 URL 是什么即可打开该页面。(尝试一下,您只需说出“Amazon.com 页面”即可!)此 URL 还将显示出来,并且应该是“可删节”的。也就是说,如果用户删去 URL 的末端,键入 http://51aspx.com/CV/UrlReWriter/,他们应该看到所有产品的列表,或者至少应该看到他们可以查看的所有类别的产品列表。
注意:要获得“可删节”URL 的最好示例,可考虑使用由许多 blog 引擎生成的 URL。要查看 2004 年 1 月 28 日的帖子,用户可以访问诸如 http://someblog.com/2004/01/28 的 URL。如果该 URL 被删节为 http://someblog.com/2004/01,用户将看到 2004 年 1 月的所有帖子。将该 URL 进一步删节为 http://someblog.com/2004 将显示 2004 年的所有帖子。
除了简化 URL 之外,URL 重写还经常用于处理网站重组,以免导致大量链接断开或书签过期。
返回页首

请求到达 IIS 时将会发生什么情况在正式研究 URL 如何实现重写之前,应首先了解 Microsoft® Internet Information Services (IIS) 如何处理传入请求,这一点非常重要。当请求到达 IIS Web 服务器时,IIS 检查被请求文件的扩展名以确定如何处理该请求。IIS 可以自行处理请求(如 HTML 页面、图像以及其他静态内容),或者将请求路由到 ISAPI 扩展。(ISAPI 扩展是一个处理传入 Web 请求的非托管编译类。其任务是生成被请求资源的内容。)
例如,当传入针对 Info.asp 网页的请求时,IIS 会将此消息路由到 asp.dll ISAPI 扩展。然后,该 ISAPI 扩展将加载被请求的 ASP 页面,执行该页面,并将所呈现的 HTML 返回给 IIS,然后,IIS 将该 HTML 发送回请求客户端。对于 ASP.NET 页面,IIS 会将此消息路由到 aspnet_isapi.dll ISAPI 扩展。然后,aspnet_isapi.dll ISAPI 扩展将处理操作传递给托管的 ASP.NET 辅助进程,该辅助程序将处理请求,并返回 ASP.NET 网页的呈现 HTML。
您可以自定义 IIS,以指定扩展名与 ISAPI 扩展的映射关系。图 1 显示了 Internet Information Services 管理工具的“应用程序配置”对话框。请注意,与 ASP.NET 有关的扩展名(.aspx、ascx、config、asmx、rem、cs、vb 及其他)均已映射到 aspnet_isapi.dll ISAPI 扩展。

1. 已配置的文件扩展名映射
讨论 IIS 如何管理传入请求稍稍超出了本文范围。但是可以在 Michele Leroux Bustamante 的文章 Inside IIS and ASP.NET 中找到对此内容的深入讨论。ASP.NET 引擎仅处理那些扩展名已明确映射至 IIS 中的 aspnet_isapi.dll 的传入 Web 请求,了解这一点非常重要。
使用 ISAPI 筛选器检查请求IIS 除了可以将传入 Web 请求的文件扩展名映射到相应的 ISAPI 扩展之外,还将执行许多其他任务。例如,IIS 将尝试对发出请求的用户进行身份验证,并确定通过身份验证的用户是否有权限访问被请求的文件。在处理请求的有效期内,IIS 将经历几个状态。在每个状态下,IIS 都将引发可以使用 ISAPI 筛选器以编程方式进行处理的事件。
与 ISAPI 扩展一样,ISAPI 筛选器是在 Web 服务器上安装的非托管代码块。ISAPI 扩展被设计为可以响应针对特定文件类型的请求。另一方面,ISAPI 筛选器还包含可以对 IIS 引发的事件进行响应的代码。ISAPI 筛选器可以截取甚至修改传入和传出的数据。ISAPI 筛选器可以应用于很多方面,包括:

  • 身份验证和授权。
  • 记录和监视。
  • HTTP 压缩。
  • URL 重写。

虽然 ISAPI 筛选器可用于执行 URL 重写,但本文将讨论如何使用 ASP.NET 实现 URL 重写。不过,我们将对使用 ISAPI 筛选器与使用 ASP.NET 中的技术实现 URL 重写进行权衡。
请求进入 ASP.NET 引擎时将会发生什么情况在 ASP.NET 之前,需要使用 ISAPI 筛选器来实现 IIS Web 服务器上的 URL 重写。由于 ASP.NET 引擎与 IIS 非常相似,因此可以使用 ASP.NET 进行 URL 重写。存在相似之处的原因在于 ASP.NET 引擎可以实现以下功能:

  • 在处理请求时可以引发事件。
  • 允许任意数量的 HTTP 模块处理所引发的事件,这与 IIS 的 ISAPI 筛选器相似。
  • 将呈现被请求资源这项任务委托给 HTTP 处理程序,该处理程序与 IIS 的 ISAPI 扩展相似。

与 IIS 一样,ASP.NET 引擎在请求的有效期内将会触发事件,通过发信号来表示其处理过程从一个状态改变为了另一个状态。例如,当 ASP.NET 引擎首次响应请求时,BeginRequest 事件将被触发。接下来触发的是 AuthenticateRequest 事件,该事件在已建立用户标识时出现。(此外,还有大量的其他事件:AuthorizeRequestResolveRequestCacheEndRequest,等等。这些事件属于 System.Web.HttpApplication 类;有关详细信息,请参阅位于以下网址的技术文档:HttpApplication Class Overview。)
正如上一部分所讨论的,可以创建 ISAPI 筛选器以响应 IIS 引发的事件。同样,ASP.NET 提供了 HTTP 模块,该模块可以响应由 ASP.NET 引擎引发的事件。可以将 ASP.NET Web 应用程序配置为具有多个 HTTP 模块。对于由 ASP.NET 引擎处理的每个请求,将初始化每个已配置的 HTTP 模块,并允许将事件处理程序绑定到处理请求期间所引发的事件。请注意,对每个请求均使用了许多内置 HTTP 模块。其中的一个内置 HTTP 模块是 FormsAuthenticationModule,该模块首先检查是否使用了窗体身份验证,如果使用,将检查是否对用户进行了身份验证。如果没有使用,会自动将用户重定向到指定的登录页面。
如上所述,通过使用 IIS,传入请求将最终发送给 ISAPI 扩展,而 ISAPI 扩展的任务是返回特定请求的数据。例如,在请求传统的 ASP 网页时,IIS 将请求传递给 asp.dll ISAPI 扩展,该扩展的任务是返回被请求的 ASP 页面的 HTML 标记。ASP.NET 引擎使用相似的方法。初始化 HTTP 模块后,ASP.NET 引擎的下一项任务是确定应由哪个 HTTP 处理程序来处理请求。
所有通过 ASP.NET 引擎传递的请求最终都将到达 HTTP 处理程序或 HTTP 处理程序工厂(HTTP 处理程序工厂仅返回 HTTP 处理程序的实例,然后使用该实例来处理请求)。最终的 HTTP 处理程序将返回响应,即呈现被请求的资源。此响应将被发送回 IIS,然后 IIS 将响应返回给提出请求的用户。
ASP.NET 包括许多内置的 HTTP 处理程序。例如,PageHandlerFactory 用于呈现 ASP.NET 网页。WebServiceHandlerFactory 用于呈现 ASP.NET Web 服务的响应 SOAP 信封。TraceHandler 将向 trace.axd 呈现请求的 HTML 标记。
图 2 描述了如何处理对 ASP.NET 资源的请求。首先,IIS 接收到请求,并将请求调度给 aspnet_isapi.dll。接下来,ASP.NET 引擎对已配置的 HTTP 模块进行初始化。最后将调用正确的 HTTP 处理程序,并呈现被请求的资源,将所生成的标记返回给 IIS 和请求客户端。

2. IIS 和 ASP.NET 正在处理请求

转载于:https://www.cnblogs.com/yssoft/articles/1488080.html

在ASP.NET中UrlRewrite的实现(能隐藏扩展名)之一相关推荐

  1. SQL Server数据库mdf文件中了勒索病毒.FREEMAN。扩展名变为FREEMAN

    SQL,数据库,勒索病毒,mdf文件中毒,FREEMAN SQL Server数据库mdf文件中了勒索病毒.FREEMAN.扩展名变为FREEMAN ***.ldf.FREEMAN ***.mdf.F ...

  2. SQL Server数据库mdf文件中了勒索病毒BUNNY。扩展名变为BUNNY

    SQL Server数据库mdf文件中了勒索病毒BUNNY.扩展名变为BUNNY ***.ldf.BUNNY ***.mdf.BUNNY ***.ldf.BUNNY ***.mdf.BUNNY SQL ...

  3. SQLServer数据库mdf文件中了勒索病毒firex3m,扩展名变为mdf.firex3m

    ** SQL Server数据库mdf文件中了勒索病毒firex3m,扩展名变为mdf.firex3m,导致公司金蝶,用友财务ERP软件不能使用.OA软件也不能使用. ** 常见的扩展名如下: .fi ...

  4. SQL Server数据库mdf文件中了勒索病毒 mercury。扩展名变为 mercury

    2019-01-24 15:57:27 SQL,数据库,勒索病毒,mdf文件中毒,mercury *SQL Server数据库mdf文件中了勒索病毒.mdf.mercury.mercury SQL S ...

  5. php.krab病毒,SQLServer数据库中了勒索病毒加密,扩展名改为Globeimposter-Alpha666qqz

    SQLServer数据库服务器mdf文件中了勒索病毒,扩展名被篡改为.Globeimposter-Alpha666qqz 常见的扩展名如下: .Globeimposter-Alpha666qqz .G ...

  6. c#文件名去掉后缀_C#如何从文件路径中分离出文件名以及文件扩展名

    在C#文件操作的过程中或者Asp.Net文件的处理过程中,有时候知道文件的完整路径信息后,需要从完整路径中分离出文件名以及文件的后缀名等信息,此文将简要介绍C#语言如何从文件路径中分离出文件名以及文件 ...

  7. linux中删除.lnk文件,LNK 文件扩展名: 它是什么以及如何打开它?

    LNK 问题的来源 打开 LNK 文件的麻烦 Microsoft Windows 不在 尝试打开 LNK 文件时,您收到错误 "无法打开 LNK 文件类型". 通常情况下,这意味着 ...

  8. vba 检查一个文件夹中的文件在另一个文件夹中是否存在(不含扩展名)

    Sub test()Dim Mypath, MyName Dim n As Integer n = 0 Dim MyStr() As String, wz As IntegerMypath = Thi ...

  9. linux中的lnk格式,ink文件扩展名,ink文件怎么打开?

    .ink 文件类型1:Pocket PC Handwritten Note 文件说明:Textual note or drawing created on a Pocket PC PDA using ...

最新文章

  1. java swing 外观框架_【GUI】一、Swing外观框架BeautyEye使用
  2. pandas中dataframe的构造(csv等结构化文件读取,字典读取)以及保存
  3. MASK-RCNN学习一:(数据集/原理介绍)
  4. c创建python虚拟机_Docker-ce运用一:创建虚拟机
  5. 关于静态库与动态库【Linux 】【C】
  6. 数据科学与大数据技术的案例_作为数据科学家解决问题的案例研究
  7. Python for循环的用法,怎么前面还有一个变量或函数?
  8. 为什么要把id存到redis的key中_干货|mysql:exists还是in?哪个性能好?为什么?
  9. python手写板_Python3使用PyQt5制作简单的画板/手写板的代码详解
  10. mail企业邮箱登录入口有哪些?
  11. 初识爬虫——爬虫与HTML介绍
  12. 图灵奖得主Geoffrey Hinton最新研究:利用神经网络对有关节三维模型进行估计的方法NASA
  13. 开源项目车牌识别EasyPR的使用
  14. 给我新人生的skycc营销软件
  15. HTML5方方面面的活动报道,大家来吐槽啊
  16. 视频处理软件有那些,优缺点介绍
  17. Airplay、DLNA和Miracast三种技术的介绍
  18. 电滑环的应用以及作用是什么
  19. ZEMAX | 如何使用 OpticStudio 设计车标投影系统 Ⅰ
  20. github nodejs mysql_GitHub - lizhuohaicode/express: nodejs服务端开发(Express+Mysql)---小k博客...

热门文章

  1. Java IO: 网络
  2. singleton模式四种线程安全的实现
  3. 把Nginx注册成Windows 系统服务(转载)
  4. python pexpect 模块
  5. python 操作 excel
  6. ROS系统 实现客户端Client和服务端Server
  7. java使用集合存储过程_详解java调用存储过程并封装成map
  8. Auto.js 抖音--留痕--参数分析
  9. Tomcat集群+Nginx反向代理+负载均衡
  10. android中获取某段程序的执行时间