这段时间在学习ASP.NET路由、HTTP处理等内容,了解了一些,但又未完全弄懂,似是而非,不管如何,作一总结,供日后借鉴和修改。
一、IIS6和IIS7经典模式和集成模式
在IIS6及IIS7经典模式下,对ASP.NET的处理部分是独立出来的,靠aspnet_isapi.dll来处理完成。一个请求从浏览器发到IIS,IIS先判断请求的类型,如果是ASP.NET部分,就转发给aspnet_isapi.dll来处理,处理完了再返回给IIS,再由IIS返回到浏览器。
而在IIS7集成模式中,不管什么资源,什么类型,都在同一个管道中完成。
参考文章:
深入解读IIS 7中应用程序池的管道模式
http://tech.techweb.com.cn/redirect.php?fid=2&tid=496369&goto=nextnewset
Asp.Net生命周期和Http管道技术
http://www.cnblogs.com/refactor/archive/2012/07/06/2568742.html
也就是说,我写一个HTTP处理模块(module)、程序(handler),如果在IIS6和经典模式下,对静态页面之类的资源,是不起作用的,但IIS7的集成模式下,就可以。另外,如果我想写一个HTTP Handler 来实现什么路由:
http://www.test.com/a.action/id/1 ==》http://www.test.com/a.aspx?id=1,则
在IIS6下,需要映射后缀名为.action的文件到aspnet_isapi.dll
在IIS7经典模式下,需要在web.config中注册和声明
在IIS7集成模式下,最简单,仅需少许配置
app_code/myhandler.cs
/// <summary>
/// handler 的摘要说明
/// </summary>
public class MyHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.Write("<H1>Hello, I'm an HTTP handler</H1>");
//HttpRequest request = context.Request;
//context.Response.Redirect("/default2.aspx");
}
public bool IsReusable
{
get
{
return false;
}
}
}
IIS7经典模式下的web.config
<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.action"
type="MyHandler" />
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="MyHandler" verb="*" path="*.action"
modules="IsapiModule"
scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll"
resourceType="Unspecified" />
</handlers>
</system.webServer>
</configuration>
IIS7集成模式下
<?xml version="1.0"?>
<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.webServer>
<handlers>
<add name="SampleHandler" verb="*"
path="*.action"
type="MyHandler"
resourceType="Unspecified" />
</handlers>
</system.webServer>
</configuration>
参考文章:
HTTP 处理程序和 HTTP 模块概述
http://msdn.microsoft.com/zh-cn/library/bb398986(v=vs.100).aspx二、ASP.NET路由
路由不是MVC特有的功能,WEB FORM程序也完全可以采用。问题是,IIS6和IIS7经典模式下,因为上述原因,路径中一定要加后缀名,比如http://www.test.com/a.aspx/id/1,
否则不起作用,URL的优美、友好性不免打上折扣。
还有一个问题,就是采用路由之后,如何读取参数。
习惯了传统URL下,QueryString的方式。但采用路由,是不能像常见的URL重写那样,将参数附在目标页面后面比如
routes.MapPageRoute("productinfo",
"pid.ashx/{id}",
"~/handler.ashx?pid=");
我曾经以为可以将这个{id},附在目标地址后面,写成这个样子,hanler.ashx?pid=$1,结果没门。
参数是怎么提取的呢?是在目标页面里,用Page.RouteData.Values["..."]的方式提取。并且这个页面要是aspx页面,ashx还不行。
ASP.NET 路由
http://msdn.microsoft.com/zh-cn/library/cc668201(v=vs.100).aspx
三、URL重写过时了吗
又有路由,又有自定义的HTTP处理模块、程序,还要URL重写干嘛?微软有一个给IIS7的重写模块外,其他都是杂牌军,总有点怪怪的感觉。
(详见拙作http://blog.csdn.net/leftfist/article/details/9283141)
但是,对于IIS6和IIS7经典模式来讲,URL重写可以处理静态资源类地址,证明在IIS处理过程中,先于ASP.NET一步,我相信它的性能要比路由和自定义HTTP处理要高。并且各种正则表达式,复杂是复杂了一点,但毕竟能实现得相当好。
这些不同WEB服务器下的特点,是我们想实现优美、友好的URL所要考虑的。
分享到:
相关推荐
asp.net c# Url重写和无扩展名Url重写 内有所有源码 注:无扩展名Url重写,必须是虚拟目录的相对路径
用ASP.NET实现URL重写 用ASP.NET实现URL重写 用ASP.NET实现URL重写 用ASP.NET实现URL重写 用ASP.NET实现URL重写 用ASP.NET实现URL重写 用ASP.NET实现URL重写 用ASP.NET实现URL重写
为了有助于描述如何在 ASP.NET Web 应用程序中实现 URL 重写,我创建了 URL 重写引擎。此重写引擎将提供以下功能: 使用 URL 重写引擎的 ASP.NET 页面开发人员可以在 Web.config 文件中指定重写规则。 重写规则...
ASP.NET MVC URL重写与优化
asp.net url重写 demo 框架 3.5 利用Intelligencia.UrlRewriter.dll组件实现url重写
Asp.Net的URLReWrite的源代码含详细具体的配置方法,在info.doc里。
ASP.NET URL重写示例,包括配置文件,重写路径XML文件,开源.NET URLRewriter类库
asp+asp.net1.1 URL重写后出现的问题
在本篇文章中,我将带你了解如何在ASP.NET中简单的实现URL重写,以及一些常见问题的解决办法。我还将说明为什么URL重写如此重要,以及如何使用它来增强你的网站。什么是URL重写? URL重写就是首先获得一个进入的URL...
asp.net 中重写url
asp.net实现url重写,asp.net实现url重写简单实例
asp.net2.0的URL重写例子 以及伪静态,具体请看这里: http://yangmingsheng.cn/?/_articleshow/117.html
ASP.NET中重写URL 共4种方法,大家可以参考
ASP.NET URL重写示例,并代有UrlRewriter源代码 演示地址:http://blog.csdn.net/homezzm/archive/2009/11/05/4771350.aspx
asp.net 重写技术 asp.net 重写技术 asp.net 重写技术 asp.net 重写技术 asp.net 重写技术
asp.net url重写(URLRewriter)
这是一个非常实用的:asp.net Url重写与动态生成静态页面。效果很好
ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中可能遇到的陷阱及处理办法。 需要手动为UrlRewriteWebSite目录添加一个到...
在 ASP.NET 中执行 URL 重写.pdf 介绍如何使用Microsoft ASP.NET执行动态URL重写。
对url地址重写方便seo的搜索,提高网站访问的安全性,对地址栏中的地址实现隐藏。