关于asp.net:IIS URL重写与URL路由

IIS URL Rewriting vs URL Routing

我打算将URL路由用于Web窗体应用程序。 但是,在阅读了一些帖子之后,我不确定这是否是一种简单的方法。

将URL重写模块用于Web表单是否更好? 但是,仅适用于IIS7。 最初,有些嗡嗡声表明URL路由与Asp.Net MVC完全脱钩,可以用于Web表单。

希望听到任何建议。


这是我找到的关于该主题的最佳文章:Ruslan Yakushev的IIS URL重写和ASP.NET路由。

IIS URL重写

当客户端向Web服务器请求特定URL时,URL重写组件将分析所请求的URL,并将其更改为同一服务器上的其他URL。 URL重写组件在请求处理管道中非常早地运行,因此能够在Web服务器决定使用哪个处理程序来决定请求之前修改请求的URL。

IIS URL Rewriting

ASP.NET路由

ASP.NET路由被实现为托管代码模块,该模块在"解析缓存"阶段(PostResolveRequestCache事件)和"地图处理程序"阶段(PostMapRequestHandler)插入IIS请求处理管道。 ASP.NET路由配置为针对Web应用程序发出的所有请求运行。

IIS URL Routing

URL重写和ASP.NET路由之间的区别:

  • URL重写用于在Web服务器处理请求之前操纵URL路径。 URL重写模块对什么处理器最终将处理重写的URL一无所知。另外,实际的请求处理程序可能不知道URL已被重写。
  • ASP.NET路由用于根据请求的URL路径将请求调度到处理程序。与URL重写相反,路由组件了解处理程序,并选择应为所请求的URL生成响应的处理程序。您可以将ASP.NET路由视为一种高级处理程序映射机制。
  • 除了这些概念上的差异外,IIS URL重写和ASP.NET路由之间还存在一些功能差异:

  • IIS URL重写模块可与任何类型的Web应用程序一起使用,包括ASP.NET,PHP,ASP和静态文件。 ASP.NET路由只能与基于.NET Framework的Web应用程序一起使用。
  • IIS URL重写模块以相同的方式工作,而不管应用程序池是使用集成的还是经典的IIS管道模式。对于ASP.NET路由,最好使用集成管道模式。 ASP.NET路由可以在经典模式下工作,但是在那种情况下,应用程序URL必须包含文件扩展名,或者必须将应用程序配置为在IIS中使用" *"处理程序映射。
  • URL重写模块可以根据域名,HTTP标头和服务器变量做出重写决定。默认情况下,ASP.NET路由仅适用于URL路径和HTTP-Method标头。
  • 除了重写之外,URL重写模块还可以执行HTTP重定向,发出自定义状态代码和中止请求。 ASP.NET路由不会执行这些任务。
  • URL重写模块在当前版本中不可扩展。 ASP.NET路由是完全可扩展和可定制的。

  • IIS团队的成员在这里发表了一篇很棒的文章,介绍了两者之间的区别。

    我建议的一个警告是,对于WebForms,在使用"路由"时需要小心。我已经编写了一个示例实现,该示例实现了如何将路由与WebForms一起使用,从而解决了这些问题,并有望帮助回答您的问题。


    您是否希望将格式化的网址作为生成页面的工厂?

    还是要使.aspx消失?

    重写,是为了使.aspx消失,或者只是整理URL。

    路由用于查看请求并确定应由哪个对象处理。听起来很像,菲尔·哈克(phil haack)对此有一些不错的文章。

    在iis6中,isapiRewrite非常好


    最近,我刚刚编写了自己的重写系统,以使站点上的URL看起来更好。基本上,您将需要编写自己的IHttpModule并将其添加到web.config中以拦截传入的请求。然后,您可以使用HttpContext.Current.RewritePath更改所指向的内容。

    您还需要将站点配置为使用aspnet_isapi进行所有操作。

    您会发现很多小问题,例如尝试使用在其上使用"尾巴"的页面(例如PageMethods),或者页面元素和表单回发的路径,但是您将逐步解决它们。

    如果有兴趣,我可以发布代码链接,您可以签出。我已经解决了许多问题,因此您可以随时阅读。我敢肯定,还有很多其他人也这样做,这可能也是很好的资源。


    您可能想看看我对这个问题的答案:ASP.NET-构建您自己的路由系统。我提供了一些很好的参考,以帮助您使用url重写方法或ASP.NET MVC项目中提供的新路由引擎来构建自己的路由系统。


    对于IIS上的URL重写,IIRF可在IIS5、6、7中使用。免费。简单。快速。开源。正则表达式支持。


    .Net 3.5 SP1中提供的Dynamic Data项目显示了URL路由实现的一个很好的例子。


    推荐阅读