2010-12-17 16 views
0

因此,可以在app.config,web.config,machine,config中設置appSettings ...但是,當您在IIS 7下工作時,您還可以在applicationHost.config下應用appSettings,併爲您的站點指定一個特定的。那麼,對我來說,知道我應該使用什麼AppSettings的一致方式是?獲取ApplicationHost.config帳戶的AppSettings的一致方式是什麼?

如果這是一個客戶端配置文件,System.Configuration.ConfigurationManager沒問題。 System.Web.Configuration.WebConfigurationManager如果這是一個Web應用程序......嗯,也許。 Microsoft.Web.Administration,如果我期望applicationHosting.config中的值 - ouch ...,即使如此,他們也不會分階段地累積起來,所以看起來您仍然持有該進程。

有沒有人有一致的方法來處理applicationHost.config帳戶的AppSettings?

回答

1

你不能在你的applicationHost.config文件中指定<appSettings>。這是因爲applicationHost.config僅定義了特定於IIS的設置。您可以查看applicationHost.config架構,以確認這一點:

%systemroot%\System32\inetsrv\config\schema\IIS_schema.xml

如果你嘗試編輯applicationHost.config並添加<appSetting>部分站點或下<location path="...">部分,你會得到一個錯誤(IIS可能不啓動並且IIS MMC控制檯將顯示配置錯誤)。

如果配置在IIS管理器中的全局應用程序設置這實際上獲取主web.config文件IIS中的默認.NET Framework版本設置相匹配配置。

<appSettings/>是特定於.NET Framework和只能在配置:

 
%SYSTEMROOT%\Microsoft.NET\Framework\[framework version]\CONFIG\machine.config 
%SYSTEMROOT%\Microsoft.NET\Framework\[framework version]\CONFIG\web.config 
%SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\CONFIG\machine.config 
%SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\CONFIG\web.config 

,當然,你的應用程序的app.configweb.config文件。

我的建議是保存這些設置您的本地應用程序,除非是難得的機會,你需要一定的價值是在全球上市。

更新:

現在,我明白你的問題 - 你有多個IIS站點,所有指向同一個物理文件夾 - 還有接近這種方式。

你可以在你的數據庫的配置表中有任何的HTTP_HOST值是主鍵。這將映射到一個前綴,例如:

 
Host    SitePrefix 
====    ====== 
domain1.com  D001 
domain2.com  D002 

在你web.config

在你的應用程序的Application_Start事件Global.asax.cs初始化程序範圍的值:

void Application_Start(object sender, EventArgs e) 
{ 
    // Code that runs on application startup 
    string httpHost = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]; 
    Application["SitePrefix"] = GetSiteKeyFromDb(httpHost); 
} 

該值將可在整個應用程序,但獨特的網站。

當你需要閱讀的設置特定於網站:

string siteSetting = ConfigurationManager.AppSettings[ 
    HttpContext.Current.Application["SitePrefix"] + "_Setting1" 
]; 

但是,如果你擊中Application_Start數據庫那麼它實際上可能是有利的存儲在所有這些網站的具體設置數據庫然後在Application中讀取並緩存它們,而不是使用<appSettings />

+0

你可能是正確的...雖然它沒有給出任何錯誤,當我把該位置之下。至於具體情況......它與使用單個物理路徑來託管多個虛擬主機有關。簡短的和不幸的答案是,儘管你可以重用代碼,你仍然留下了一個單一的配置和*你*必須駕駛你的答案關閉HTTP_HOST。我試圖避免編寫代碼來處理主機特定的配置,因爲這正是IIS正在做的。哦,生活和學習。 – Ajaxx 2010-12-19 06:03:32

+0

@ajaxx - 當你說多個虛擬主機時,你的意思是單個站點有多個主機頭還是多個站點指向同一個物理文件夾? – Kev 2010-12-19 11:48:15

+0

同一物理主機上的多個站點都指向相同的物理文件夾。這是一個asp.net網站,幾乎所有東西都是數據驅動的。真的沒有理由重複部署的資源,所以我們沒有。唯一的警告是我們希望能夠進行基於站點的配置 - 而不是基於物理路徑(web.config)。我們將依靠服務器變量來做出一些關鍵決策。 – Ajaxx 2010-12-19 20:33:46

0

我使用Anti-Santa的答案提供的信息來做到這一點,但我不想來解析URL,並有另一個數據庫來查找信息。內部使用相同的代碼庫,在這種情況下我不會有這些代碼片段。

只需將appSettings添加到帶有location節點的.NET Framework web.config即可。

%SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\Config\web.config,添加以下內容,其中Site1Site2是我指向相同的物理目錄中的兩個應用:

<?xml version="1.0" encoding="utf-8"?> 
<!-- the root web configuration file --> 
<configuration> 

    <!-- App settings for the different applications --> 
    <location path="Default Web Site/Site1"> 
     <appSettings> 
      <add key="ConnectionString" value="the cnn str"/> 
     </appSettings> 
    </location> 
    <location path="Default Web Site/Site2"> 
     <appSettings> 
      <add key="ConnectionString" value="the cnn str"/> 
     </appSettings> 
    </location> 

... 

</configuration> 

的物理文件夾的web.config將覆蓋此appSetting所以我還需要從刪除該文件。

相關問題