设为首页 收藏本站
查看: 2018|回复: 0

[经验分享] IIS中ASP.NET虚拟目录不继承主站点web.config设置的办法(转载)

[复制链接]

尚未签到

发表于 2017-12-28 08:42:36 | 显示全部楼层 |阅读模式
  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>  
</connectionStrings>
  

<--子目录的Web.config(clear方法)-->  
<connectionStrings>
  
<clear/>

  
<add name="BlogEngine" connectionString="Data Source=localhost\SQLEXPRESS; Initial Catalog=BlogEngine2; User>  
</connectionStrings>
  

<--子目录的Web.config(remove方法)-->  
<connectionStrings>
  
<remove name="BlogEngine"/>

  
<add name="BlogEngine" connectionString="Data Source=localhost\SQLEXPRESS; Initial Catalog=BlogEngine2; User>  
</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使其不予根目录的配置冲突,一个新的网站就上线了!就是这么简单。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-428859-1-1.html 上篇帖子: IIS部署Angular2 下篇帖子: IIS 7启用static JSON文件能POST方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表