MVC为什么不再需要注册通配符(*.*)了?

文章内容

很多教程里都提到了,在部署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为什么不再需要注册通配符(*.*)了?的更多相关文章

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

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

  2. 使用MVC的实现登录注册功能

    文章目录 1.视图层(View)页面的编写: 1.1.登录页面 1.2.注册页面 2.控制层(Controller)的编写 2.1. 注册 2.2 .登录 2.3 .实体类 3.Model层(Mode ...

  3. 三层架构(MVC)实现简单登陆注册验证(含验证码)

    前言在我的上一篇微博里我已经提出了登陆的方法,当时我采取的是纯servlet方式,因为当时刚接触到servlet,正好网上没有这方面的全面讲解,所以我就发飙了.不过在现实生产中我们大多采用的三层架构. ...

  4. mvc 母版页中登录注册和问候的处理

    方式一:    在母版页直接调用方法返回,用户的session["userName"]也在母版页判断 2. 创建一个局部视图,在局部试图中将代码和数据调用写好引用单母版页 3. 自 ...

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

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

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

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

  7. Asp.Net MVC 5使用Identity之简单的注册和登陆

    由于.Net MVC 5登陆和注册方式有很多种,但是Identity方式去实现或许会更简单更容易理解 首先新建一个项目 其次如下选择Empty和MVC的选项 然后打开NuGet包管理器分别安装几个包 ...

  8. asp.net MVC 应用程序的生命周期

    下面这篇文章总结了 asp.net MVC 框架程序的生命周期.觉得写得不错,故转载一下. 转载自:http://www.cnblogs.com/yplong/p/5582576.html       ...

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

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

随机推荐

  1. Android开发模板------自己定义SimpleCursorAdapter的使用

    使用SimpleCursorAdapter所设计的table(数据表)一定要有_id字段名称,否则会出现"找不到_id"的错误 SimpleCursorAdapter直接使用的方法 ...

  2. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  3. 在MVC5中的使用Ninject

    在MVC5中的使用 Ninject 从MVC3中就开始接触Ninject这个IOC工具.也一直是MVC Framework系列书籍中推荐的IOC工具,当然还有优秀的Autofac等.性能和使用上面个有 ...

  4. Flex自定义组件开发之日周月日期选择日历控件

    原文:Flex自定义组件开发之日周月日期选择日历控件         使用过DateField的我们都知道,DateField 控件是用于显示日期的文本字段,字段右侧带有日历图标.当用户在控件边框内的 ...

  5. oracle_修改Oracle数据库字符集 AL32UTF8;

    修改数据库字符集 以支持维文等  utf8 停掉库 进入装载模式 ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_ ...

  6. 表达式树 Expression

    转载泛型方法动态生成表达式树 Expression public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> ...

  7. ThinkPHP 3.2 开放 cache注缓存,过滤非法字符

    打开缓存配置文件 /Application/Common/conf/cache.php源代码如下面: <?php return array( //'配置项'=>'配置值' 'LAYOUT_ ...

  8. iOS程序 # 启动过程

    [ App 应用 ] 中文名:缺省 外文名:default 拼音:quē shěng 释义:系统默认状态 全称:缺省状态 -------------- 1.程序启动顺序 1> main.m程序入 ...

  9. .net 控件开发第二天 怎么将 第一天写的代码 用到 .net中来

    前面第一天 我们看到的全是 js的代码,虽然不管是BS的框架是java 还是 php,复用性 还是特别高的,  但是 写起来比较费劲,怎么办,我们能不能 更 简单点呢? 当然可以,这个时候我们就要用到 ...

  10. UI 收集

    semantic http://www.semantic-ui.com.cn/modules/reveal.html sbadmin http://startbootstrap.com/templat ...