ASP.NET提供了强大的Web.config来配置网站,一般来说一个网站只有一个根目录下的Web.config文件,有时候我们希望子目录有着不同的权限或者参数设置,则可以在相应子目录增加一个Web.config配置文件,加入我们新的配置参数。这里需要注意的是,子目录web.config是继承父目录的所有设置的,因此,如果子目录放的是一个和父目录里不一样的网站,就不能共享父目录的配置了,否则很可能会冲突。比如很多主机都提供了将域名绑定到子目录从而能够建立多个网站的方法,以Godaddy的Windows主机为例,如果我们想通过子目录建立一个全新的网站,如果不配置好正确的Web.config,很可能会报HTTP 500错误Internal Server Error。下面会分析出现该错误的原因,并给出了正确的配置方法。

查看HTTP 500错误详情

在自己机器上很容易看到错误,但是上传到远程主机后,往往只会提示友好的错误信息,让我们无法知道细节。为了查看错误发生的原因,需要显示错误详情,修改根目录和子目录网站的Web.config文件,在system.webServer节点中添加如下配置,

<httpErrors errorMode="Detailed" />

在system.web节点添加如下配置

<customErrors mode="Off"/>

这样就可以看到详细的错误来源了。子目录网站产生500 Internal Server Error错误的原因多半是和Web.config配置冲突导致。比如在根目录定义了一个name为"connStr"的connectioinString节点,如果在子目录中定义name同样为"connStr"的connectionString节点,则会出错,因为任何配置节点都不允许重复键的加入,否则会提示Dulplicate key之类的错误。那么怎么避免子目录和根目录的配置冲突呢?一般有两种解决方法,一种是修改根目录中的Web.config,使其消除子目录和根目录的继承关系,即子目录Web.config的配置不受根目录Web.config的影响;第二种方法是修改子目录的Web.config,在所有可能和根目录的Web.config产生冲突的配置add之前先clear或者remove根目录的配置信息。下面详细讨论这两种使子目录Web.config独立于根目录的方法。

子目录使用独立Web.config的配置方法

首先看第一种方法,即通过修改根目录的Web.config消除继承关系,在根目录Web.config文件的system.web或者一切不想让子目录继承的配置节点外面添加一层location如下:

<configuration>
<!--...其他配置...-->
<location path="." inheritInChildApplications="false">
<system.web> </system.web>
</location>
<!--...其他配置...-->
</configuration>

这里inheritInChildApplications很好理解,即是否允许子目录继承,默认为true,我们修改为false就可以避免继承了。这种方法的优点是很简单,但是不够灵活,同时面对较复杂的Web.config配置,仍可能会报错。比如根目录和子目录有着不同的system.webServer配置,按照这个方法在根目录的system.webServer外面加上了location限制,不幸的是,IIS7下会出现500错误。当然,也有解决方法,可以参考下面这篇文章。

"SOLVED: IIS7, validateIntegratedModeConfiguration and inheritInChildApplications clash"

接着看第二种方法,不用修改根目录的Web.config文件,而是修改子目录的Web.config。假设根目录的Web.config设置了一个名为BlogEngine的连接字符串,要在子目录使用另一个名字为BlogEngine的连接字符串,就需要先清除已有的连接字符串(根目录继承下来的connectionString设置),清除所有的配置,可以用clear语法,清除指定名称的配置,可以用remove语法,如下

<--根目录的Web.config-->
<connectionStrings>
<add name="BlogEngine" connectionString="Data Source=localhost\SQLEXPRESS; Initial Catalog=BlogEngine1; User ID=xxx; Password=xxx" providerName="System.Data.SqlClient"/>
</connectionStrings>
<--子目录的Web.config(clear方法)-->
<connectionStrings>
<clear/>
<add name="BlogEngine" connectionString="Data Source=localhost\SQLEXPRESS; Initial Catalog=BlogEngine2; User ID=xxx; Password=xxx" providerName="System.Data.SqlClient"/>
</connectionStrings>
<--子目录的Web.config(remove方法)-->
<connectionStrings>
<remove name="BlogEngine"/>
<add name="BlogEngine" connectionString="Data Source=localhost\SQLEXPRESS; Initial Catalog=BlogEngine2; User ID=xxx; Password=xxx" providerName="System.Data.SqlClient"/>
</connectionStrings>

这里只是用connectionString为例,使用时完全可以应用在所有可以配置的节点上,任何配置节点都可以用clear和remove节点将继承来的配置先清除掉,然后再add新的配置。此方法灵活性更强,同时可以保留根目录Web.config中的部分共同配置(而无需全部重新设定)。下面是一个复杂些的例子,分别是根目录和子目录在system.webServer上的配置。

<--根目录的Web.config system.webServer配置节点-->
<modules>
<remove name="ScriptModule"/>
<add name="WwwSubDomainModule" type="BlogEngine.Core.Web.HttpModules.WwwSubDomainModule, BlogEngine.Core"/>
<add name="UrlRewrite" type="BlogEngine.Core.Web.HttpModules.UrlRewrite, BlogEngine.Core"/>
<add name="CompressionModule" type="BlogEngine.Core.Web.HttpModules.CompressionModule, BlogEngine.Core"/>
<add name="ReferrerModule" type="BlogEngine.Core.Web.HttpModules.ReferrerModule, BlogEngine.Core"/>
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<--子目录的Web.config system.webServer配置节点-->
<modules runAllManagedModulesForAllRequests="true">
<remove name="WwwSubDomainModule"/>
<remove name="UrlRewrite"/>
<remove name="CompressionModule"/>
<remove name="ReferrerModule"/>
<remove name="ScriptModule"/>
<add name="UrlRewrite" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<handlers>

可以看到,子目录将所有根目录定义的Modules(WwwSubDomainModule,UrlRewrite,CompressionModule,ReferrerModule,ScriptModule)都清除了,添加了自己的UrlRewrite和ScriptModule两个Module。如此配置既消除了冲突,又可以实现了配置的部分继承(子目录只有部分配置和根目录不同),而第一种方法却无法实现部分继承。

总结

了解了Web.config的继承方式和子目录的配置方法,我们就能够很轻松的运用子目录建立一个独立于父目录的全新网站,使用完全不同的数据库和连接字符串,完全不同的Module,完全不同的HttpHandler,实在是一件很爽的事情。以Godaddy为例,将域名绑定到Godaddy的子目录,修改子目录的Web.config使其不予根目录的配置冲突,一个新的网站就上线了!就是这么简单。

IIS中ASP.NET虚拟目录不继承主站点web.config设置的办法(转载)的更多相关文章

  1. IIS中虚拟目录不继承主站点web.config设置的办法(转载)

    ASP.NET提供了强大的Web.config来配置网站,一般来说一个网站只有一个根目录下的Web.config文件,有时候我们希望子目录有着不同的权限或者参数设置,则可以在相应子目录增加一个Web. ...

  2. Asp.Net Session的三种方法及Web.Config设置

    转载:http://user.gw-ec.com/login/safelog/redirectt?session=so%2f%2bSjyZURMOe54xgk%2bUhL2CgGqDjOKEbYwZS ...

  3. IIS中不让下级应用程序继承主域名的web.config配置

    <location path="." allowOverride="true" inheritInChildApplications="fals ...

  4. ASP.NET网站中获取当前虚拟目录的应用程序目录的方法(转)

    [原创]ASP.NET网站中获取当前虚拟目录的应用程序目录的方法 ASP.NET网站中获取当前虚拟目录的应用程序目录的方法1.问题描述:有时候,某个网页控件会被不同目录下文件使用,此时如果该控件中有一 ...

  5. 在Win7中IIS配置Asp.Net虚拟文件夹的方法及错误总结!

    在Win7中IIS配置Asp.Net虚拟文件夹的方法总结! 一.右键[站点].点击[加入虚拟文件夹]或[虚拟应用程序],笔者建议最好建立虚拟应用程序,由于这就跟一个站点差点儿相同.不用考虑路径问题. ...

  6. VS中 无法创建虚拟目录 本地IIS IIS Express 外部主机

    从前就有个疑问了,为什么我拉取别人写好的代码后就可以在IIS里面生成一个网站呢? 这里所谓的生成网站,是指包含了所有源代码文件的网站:相对地,发布网站,就是指包含被编译的源文件所得到的DLL文件的网站 ...

  7. IIS 中asp.net的一些配置

    安装了IIS之后, 添加了虚拟目录然后运行页面, 出现了一点儿错误, 好像是不认识aspx文件, 把aspx文件当成是xml文件处理. 无法显示 XML 页. 使用 XSL 样式表无法查看 XML 输 ...

  8. IIs 网站应用程序与虚拟目录的区别及高级应用说明(文件分布式存储方案)

    原文 IIs 网站应用程序与虚拟目录的区别及高级应用说明(文件分布式存储方案) 对于IIS网站,大伙用的比较多,就不啰嗦了.   今天和说说大伙比较少使用的"IIS应用程序”和虚拟目录的区别 ...

  9. IIS中的上传目录权限设置问题

    虽然 Apache 的名声可能比 IIS 好,但我相信用 IIS 来做 Web 服务器的人一定也不少.说实话,我觉得 IIS 还是不错的,尤其是 Windows 2003 的 IIS 6(马上 Lon ...

随机推荐

  1. android中利用HttpURLConnection进行Get、Post和Session读取页面。

    直接上代码,调用的时候要放在线程中. package slj.getsms; import java.io.BufferedReader; import java.io.InputStreamRead ...

  2. Maven学习总结(五):maven命令的含义及用法

    Maven有许多命令,不管是在命令行(1),还是在Myecplise10的Maven项目--右键Run As(2),还是IDEA的左下角--Maven Projects--Maven项目名--Life ...

  3. 前端面试经典题目(HTML+CSS)二

    1.浏览器页面由哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层 分别是:HTML.CSS.JavaScript 作用:HTML实现页面结构,CSS完成页面的表现与风格,JavaSc ...

  4. c# 序列化接口(转载贴)

    http://www.cnblogs.com/TianFang/p/3724449.html

  5. MySQL数据库(7)----数据库的选择、创建、删除和更改

    1.选择数据库 使用 USE 语句可以选择数据库,并把它指定为MySQL服务器连接的默认(当前)数据库: USE db_name; 要想选择数据库,用户必须要具备相应的访问权限:否则,会出现错误提示. ...

  6. Apache 2 解析html中的php

    Ubuntu下安装Apache 2无法解析html中的php Ubuntu下安装了Apache 2却无法解析html中的php ,好多说是在httpd.conf文件中修改代码,但是ubuntu中没有这 ...

  7. Vue 框架-02-事件:点击, 双击事件,鼠标移上事件

    Vue 框架-02-事件:点击, 双击事件,鼠标移上事件 1.单击事件:v-on:click 源码 app2.js : //实例化 vue 对象 new Vue({ //注意代码格式 //el:ele ...

  8. 四、angularjs 如何在页面没有登录的情况下阻止用户通过更改url进入页面--$stateChangeStart

    有时候用户没有登录或者在某些情况下你是不希望用户进入页面,但是angular的路由机制可以让用户直接通过更改Url进入页面,如何处理这一问题呢? ——监控路由转换机制 $stateChangeStar ...

  9. axios 同步问题

    Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中(这是官方文档给出的一个解释说明) 它的主要作用是向后台发起异步请求,还有在请求中做更多的可控功能 1. ...

  10. 使用mybatis plus自动生成controller、service、dao、mapper、entity代码

    官网:http://mp.baomidou.com(这个项目不仅仅可以用于代码生成,还有分页等其他功能,是对mybatis的一层封装) 要求:基于sql自动生成domain.controller.se ...