文章内容

很多教程里都提到了,在部署MVC程序的时候要配置通配符映射(或者是*.mvc)到aspnet_ISPAI.dll上,在.NET4.0之前确实应该这么多,但是.NET4.0之后已经不要再费事了,因为它默认就支持了。

你可以会问,没有映射配置,请求这么可能会走到aspnet_ISPAI.dll上呢?对,这就是我们本章节要讲的一个东西:ASP.NET 4 Extensionless URL feature,因为在ASP.NET4之后,默认所有的请求都转向到aspnet_ISPAI.dll,那么在IIS6上它是如何实现的呢?首先ASP.NET4.0安装的时候会自动安装一个aspnet_filter.dll ,这是一个ISAPI筛选器,该筛选器在请求处理之前,会将所有的URL地址附加上/eurl.axd/GUID字符串,而默认情况下*.axd扩展名是映射到aspnet_isapi.dll上的,所以当我们附加/eurl.axd/GUID字符串以后,所有的请求都可以被aspnet_isapi.dll来处理了,当进入ASP.NET的时候的时候又把该/eurl.axd/GUID 字符串删除了(这个周期非常早),以便还原成原来的URL地址。.NET框架根目录下的web.config默认设置请求是DefaultHttpHandler来处理的,因为它的path=”*”,并且放在httpHandlers的第一个位置上(除非你修改了设置),此后DefaultHttpHandler将这个请求转发(不是URL跳转哦)至IIS上,这时候我们的筛选器不会再附加/eurl.axd/GUID字符串了,接下来就是正常的处理请求了,如果你想利用此特性做其它特殊的事情,那你需要在MapRequestHandler事件执行之前,修改DefaultHttpHandler为其它的HttpHandler。

有一点需要注意的是,IIS7集成模式下,处理请求的默认Handler是不是DefaultHttpHandler而是TransferRequestHandler,两个Hanlder是差不多的,具体的细节不同不在我们讨论的范畴,我们就不多说了,这些handler默认是随.NET4.0安装的时候一起安装,但是IIS7默认是不启用这个功能的,只有在安装了IIS7的QFE才能使用,QFE包含在service pack中,QFE独立下载地址为http://support.microsoft.com/kb/980368。

另外,要保持这个功能正常使用的话,下列设置需要满足条件:

  1. EnableExtensionlessUrls没定义或者是设置值为1。
  2. v4.0 aspnet_filter.dll正常注册到到IIS上作为ISPAI筛选器。
  3. v4.0 aspnet_isapi.dll处理.axd扩展名的请求,也就是.axd映射到 aspnet_ISPAI.dll上。
  4. v4.0 aspnet_isapi.dll在ISPAI限制列表里设置为允许Allowed。
  5. 网站设置为可读,并且有脚本权限。

在IIS6上要想禁用这个功能,修改注册表文件HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\EnableExtensionlessUrls为0就可以实现,因为IIS只有重启的时候才加载这个配置,所以需要重启一下才能生效。Wow64下(比如64为OS下允许32位worker process)则需要设置HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\4.0.30319.0\EnableExtensionlessUrls为0.

IIS 6, ASP.NET 4, 和ASP.NET MVC 3可以成功使用上述功能(甚至MVC2也可以,MVC1未测试),所以,以后在ASP.NET4.0上部署站点的时候,不必再设置通配符映射就可以使用MVC3功能了。

参考资料:

http://haacked.com/archive/2010/12/22/asp-net-mvc-3-extensionless-urls-on-iis-6.aspx

http://blogs.msdn.com/b/tmarq/archive/2010/06/18/how-to-disable-the-asp-net-v4-0-extensionless-url-feature-on-iis-6-0.aspx

http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx

同步与推荐

本文已同步至目录索引:MVC之前的那点事儿系列

MVC之前的那点事儿系列文章暂时结束,关于MVC正式的部分,希望有时间陆续贴上来。

MVC之前的那点事儿系列(10):MVC为什么不再需要注册通配符(*.*)了?的更多相关文章

  1. MVC之前的那点事儿系列(6):动态注册HttpModule

    文章内容 通过前面的章节,我们知道HttpApplication在初始化的时候会初始化所有配置文件里注册的HttpModules,那么有一个疑问,能否初始化之前动态加载HttpModule,而不是只从 ...

  2. MVC之前的那点事儿系列

    MVC之前的那点事儿系列,是笔者在2012年初阅读MVC3源码的时候整理的,主要讲述的是从HTTP请求道进入MVCHandler之前的内容,包括了原创,翻译,转载,整理等各类型文章,当然也参考了博客园 ...

  3. MVC之前的那点事儿 ---- 系列文章

    MVC之前的那点事儿系列,是笔者在2012年初阅读MVC3源码的时候整理的,主要讲述的是从HTTP请求道进入MVCHandler之前的内容,包括了原创,翻译,转载,整理等各类型文章,当然也参考了博客园 ...

  4. MVC之前的那点事儿系列(7):WebActivator的实现原理详解

    文章内容 上篇文章,我们分析如何动态注册HttpModule的实现,本篇我们来分析一下通过上篇代码原理实现的WebActivator类库,WebActivator提供了3种功能,允许我们分别在Http ...

  5. MVC之前的那点事儿系列(8):UrlRouting的理解

    文章内容 根据对Http Runtime和Http Pipeline的分析,我们知道一个ASP.NET应用程序可以有多个HttpModuel,但是只能有一个HttpHandler,并且通过这个Http ...

  6. MVC之前的那点事儿系列(9):MVC如何在Pipeline中接管请求的?

    文章内容 上个章节我们讲到了,可以在HttpModules初始化之前动态添加Route的方式来自定义自己的HttpHandler,最终接管请求的,那MVC是这么实现的么?本章节我们就来分析一下相关的M ...

  7. MVC之前的那点事儿系列(5):Http Pipeline详细分析(下)

    文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件,比如如下代码: public class ...

  8. MVC之前的那点事儿系列(4):Http Pipeline详细分析(上)

    文章内容 继续上一章节的内容,通过HttpApplicationFactory的GetApplicationInstance静态方法获取实例,然后执行该实例的BeginProcessRequest方法 ...

  9. MVC之前的那点事儿系列(3):HttpRuntime详解分析(下)

    文章内容 话说,经过各种各样复杂的我们不知道的内部处理,非托管代码正式开始调用ISPAIRuntime的ProcessRequest方法了(ISPAIRuntime继承了IISPAIRuntime接口 ...

随机推荐

  1. Linux(Centos)之安装Nginx及注意事项

    1.Nginx的简单说明 a.  Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,期初开发的目的就是为了代理电子邮件服务器室友:Igor Sysoev开发 ...

  2. JavaScript中this指针指向的彻底理解

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 这一点与函数中自由变量Action-varibal不同 var ...

  3. JavaScript调试 - debugger语句

    语法: debugger 作用: 启动调试器 备注: 1. 可以将debugger语句放在过程的任何地方以中止执行.2. 使用debugger语句类似于在代码中设置断点. 3. debugger语句中 ...

  4. 事务隔离级别(IsolationLevel)

    事务的特性(ACID)1.原子性(Atomicity) 事物是数据库的逻辑工作单位,事务中的诸多操作要么全做要么全不做2.一致性(Consistency) 事务执行结果必须是使数据库从一个一致性状态变 ...

  5. iOS UITableView删除cell分割线

    UITableView是UITableViewStylePlain风格的,这样整个TableView都会被分割线分隔开,不管有没有数据,非常丑. 为了可以自定义cell的分割线: 解决方案: 将UIT ...

  6. Android中的AlertDialog使用示例二(普通选项对话框)

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,AlertDialog实现方法为建造者模式. ...

  7. 史上最全的ASP.NET MVC路由配置

    MVC将一个Web应用分解为:Model.View和Controller.ASP.NET MVC框架提供了一个可以代替ASP.NETWebForm的基于MVC设计模式的应用. AD:51CTO 网+ ...

  8. Linux 平台安装Oracle Database 12c

    1)下载Oracle Database 12cRelease 1安装介质 官方的下载地址: 1:http://www.oracle.com/technetwork/database/enterpris ...

  9. java类加载器深入研究

    看了下面几篇关于类的加载器的文章,豁然开朗.猛击下面的地址开始看吧. Java类加载原理解析      深入探讨 Java 类加载器 分析BootstrapClassLoader/ExtClassLo ...

  10. mongoDB的安装(一)

    0.安装环境说明: linux系统:centos6.5 mongoDB版本:mongodb-linux-x86_64-rhel62-3.2.7.tgz 1.下载 mongoDB的下载:https:// ...