|
ASP.NET提供了強大的Web.config來配置網(wǎng)站,一般來說一個網(wǎng)站只有一個根目錄下的Web.config文件,有時候我們希望子目錄有著不同的權限或者參數(shù)設置,則可以在相應子目錄增加一個Web.config配置文件,加入我們新的配置參數(shù)。這里需要注意的是,子目錄web.config是繼承父目錄的所有設置的,因此,如果子目錄放的是一個和父目錄里不一樣的網(wǎng)站,就不能共享父目錄的配置了,否則很可能會沖突。比如很多主機都提供了將域名綁定到子目錄從而能夠建立多個網(wǎng)站的方法,以Godaddy的Windows主機為例,如果我們想通過子目錄建立一個全新的網(wǎng)站,如果不配置好正確的Web.config,很可能會報HTTP 500錯誤Internal Server Error。下面會分析出現(xiàn)該錯誤的原因,并給出了正確的配置方法。 查看HTTP 500錯誤詳情在自己機器上很容易看到錯誤,但是上傳到遠程主機后,往往只會提示友好的錯誤信息,讓我們無法知道細節(jié)。為了查看錯誤發(fā)生的原因,需要顯示錯誤詳情,修改根目錄和子目錄網(wǎng)站的Web.config文件,在system.webServer節(jié)點中添加如下配置, <httpErrors errorMode="Detailed" /> 在system.web節(jié)點添加如下配置 <customErrors mode="Off"/> 這樣就可以看到詳細的錯誤來源了。子目錄網(wǎng)站產(chǎn)生500 Internal Server Error錯誤的原因多半是和Web.config配置沖突導致。比如在根目錄定義了一個name為"connStr"的connectioinString節(jié)點,如果在子目錄中定義name同樣為"connStr"的connectionString節(jié)點,則會出錯,因為任何配置節(jié)點都不允許重復鍵的加入,否則會提示Dulplicate key之類的錯誤。那么怎么避免子目錄和根目錄的配置沖突呢?一般有兩種解決方法,一種是修改根目錄中的Web.config,使其消除子目錄和根目錄的繼承關系,即子目錄Web.config的配置不受根目錄Web.config的影響;第二種方法是修改子目錄的Web.config,在所有可能和根目錄的Web.config產(chǎn)生沖突的配置add之前先clear或者remove根目錄的配置信息。下面詳細討論這兩種使子目錄Web.config獨立于根目錄的方法。 子目錄使用獨立Web.config的配置方法首先看第一種方法,即通過修改根目錄的Web.config消除繼承關系,在根目錄Web.config文件的system.web或者一切不想讓子目錄繼承的配置節(jié)點外面添加一層location如下: <configuration> <!--...其他配置...--> <location path="." inheritInChildApplications="false"> <system.web> </system.web> </location> <!--...其他配置...--> </configuration> 這里inheritInChildApplications很好理解,即是否允許子目錄繼承,默認為true,我們修改為false就可以避免繼承了。這種方法的優(yōu)點是很簡單,但是不夠靈活,同時面對較復雜的Web.config配置,仍可能會報錯。比如根目錄和子目錄有著不同的system.webServer配置,按照這個方法在根目錄的system.webServer外面加上了location限制,不幸的是,IIS7下會出現(xiàn)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為例,使用時完全可以應用在所有可以配置的節(jié)點上,任何配置節(jié)點都可以用clear和remove節(jié)點將繼承來的配置先清除掉,然后再add新的配置。此方法靈活性更強,同時可以保留根目錄Web.config中的部分共同配置(而無需全部重新設定)。下面是一個復雜些的例子,分別是根目錄和子目錄在system.webServer上的配置。 <--根目錄的Web.config system.webServer配置節(jié)點--> <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配置節(jié)點--> <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。如此配置既消除了沖突,又可以實現(xiàn)了配置的部分繼承(子目錄只有部分配置和根目錄不同),而第一種方法卻無法實現(xiàn)部分繼承。 總結了解了Web.config的繼承方式和子目錄的配置方法,我們就能夠很輕松的運用子目錄建立一個獨立于父目錄的全新網(wǎng)站,使用完全不同的數(shù)據(jù)庫和連接字符串,完全不同的Module,完全不同的HttpHandler,實在是一件很爽的事情。以Godaddy為例,將域名綁定到Godaddy的子目錄,修改子目錄的Web.config使其不予根目錄的配置沖突,一個新的網(wǎng)站就上線了!就是這么簡單。 |
|
|
來自: NaturalWill > 《待分類1》