电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> C#>>子目录web.config继承父目录web.config造成网站出错解决一例:

子目录web.config继承父目录web.config造成网站出错解决一例

来源:网络 | 2013-4-25 | (有2333人读过)

今天要部署一个网站和一个和网站相关的webservices接口,我把网站部署后,就把WEB接口作为它下面的一个虚拟目录来处理了,这样他们可以共享一个域名.他们各个都有一个webconfig配置文件,部署后发现网站正常,可是WEB接口却报错,说配置文件出了问题,仔细检查发现WEB接口用的是网站的配置文件,一下子没招了. 

后来在网上一查,发现利用配置文件的配置节可以让它不继承父目录的配置文件,如下 

<location path="." allowOverride="false" inheritInChildApplications="false"> </location> 

把它加在父目录的<system.web>节外面即可,测试一下果然如此,甚喜,虽记之以备忘,同时也于大伙共享! 

下面是更好的一个: 

虚拟目录中的web.config继承了主目录中的web.config出现问题是由于根目录中的web.config添加了httphandler、 httpmodule 引起的。 
解决办法:将 httphandler httpmodule的声明添加到location中。 
如下所示: 
<location path="." allowOverride="true" inheritInChildApplications="false"> 
<system.web> 
<httpModules> 
<add name="UrlRewriteModule" 
type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" /> 
</httpModules> 
</system.web> 
</location> 

path 不用说指定的是一个目录 
allowOverride 指是否可以将这个重写 
inheritInChildApplications 指是否被子级应用程序继承 
一、应用身份验证、但个别目录或文件不需要身份验证 
最常见的是一个网站的后台需要验证,而前台是不需要的;一般登录页面会有验证码、而生成验证码那个页面是不需要验证的、否则验证图片是显示不出来的。 
解决方法: 
<system.web> 
      <!-- 身份验证 --> 
      <authentication mode="Forms"> 
        <forms name=".myForm" loginUrl="login.aspx" timeout="20" protection ="All"/> 
      </authentication> 
      <authorization > 
        <deny users ="?"/> 
      </authorization> 
    </system.web> 
<!-- 验证码 --> 
<location path ="CheckCode.aspx"> 
    <system.web > 
      <authorization > 
        <allow users ="*"/> 
      </authorization> 
    </system.web> 
</location>使用身份验证、禁止匿名用户访问,同时对页面checkcode.aspx允许所有用户访问、即不用验证。 

二、改写(不需求)web.config继承 
假设IIS中有个站点A、而A站点下面有个虚拟目录B、此时可以输入:"ttp://ip址/" 访问到A站点,输入http://ip地址/B 访问到B网站;而B项目中的web.config首先会继承A站点的web.config,如果A的config有很多设置如<httpModules>,<page>等,而B项目的config没有这些设置,项目也没用到这些设置,但B的程序在运行时确会出错、原因就是它继承A的config;这个让人有点讨厌“我压根没用它、怎么会有错?且提示出错的那个文件是A的config”,可以这样解决: 
A项目用到了主题 
<pages enableEventValidation="false" validateRequest="false" theme="default">B项目不用 
<pages enableEventValidation="false" validateRequest="false" theme="">让B的主题为空、否则B运行时提示找不到default主题目; 

A的设置 
<httpModules> 
          <add name="SiteCache" type="SiteCache"/> 
        </httpModules>B的设置(不用的项,清除) 
<httpModules> 
     <clear/> 
</httpModules>如果A.B都用到 
<appSettings> 
<add key="app" value="" /> 
</appSettings>B运行时会提示app已经加载,此时可以 
<appSettings> 
<remove name="app" /> 
<add key="app" value="" /> 
</appSettings>或者: 
<appSettings> 
<clear /> 
<add key="app" value="" /> 
</appSettings> 
三、禁止web.config重写 
同上面的例子、如果B中的config设置必须与A中的相同,不能重写,则A的config设置 
    <location path="B" allowOverride="false"> 
      <system.web> 
        <httpModules> 
          <add name="SiteCache" type="SiteCache"/> 
        </httpModules> 
      </system.web> 
</location>此时B的config中<httpModules>设置不能改写,须和A的设置相同。 

虚拟目录和主站点的web.config重复 
2008-01-09 10:52 
虚拟目录的web.config会继承主站点的web.config中的属性,所以对于主站点中的httphandler,httpmodule这样的结点,应在虚拟目录中去掉 

对于httpHandlers,如果父web.config中设置了对*.aspx的处理,则子web.config要像下面这样重新设置 

<remove verb="*" path="*.aspx" /> 
      <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory" /> 

本人是用.net 2.0作开发的。手头上接了个朋友的项目 
首先用web application开发了一个网站。在**选择上本来想用动网 
后来发现dz出了.net 2.0的**。考虑用这个 

但是问题就出来了,在子虚拟目录下的时候出现了和**里大多数哥们碰到的web.confg重复的问题 
在思考了3个小时后成功实现web.confg整合 

首先是自己开发的网站webconfig不变。 
DZ作为一个虚拟目录添加到bbs里。 这时候DZ的webconfig 
要修改的地方是在 

<httpModules> 
<add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" /> 
<remove name="WebbHttpModule" /> 
</httpModules>  
<httpHandlers> 
<remove verb="*" path="progress.ashx"/> 
</httpHandlers> 

这两个部分。加入你的主站点使用了 <httpModules>、 <httpHandlers>节。要在DZ的webconfig里注意remove掉 

这样就实现了整合。其实挺简单的。原因就是子目录下的这两个节会继承父目录里的 

这种方法是在能够建立多个虚拟目录的情况下的 

如果是租用服务器空件。只能建立一个虚拟目录的情况。我还没去尝试。我想这样要DZ开发人员去修改的 

之所以写这个帖子。是发现**里很多哥们碰到这样的问题不知道如何解决 
  
C#热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号