2012-07-18 133 views
5

當您別無選擇,只能在web.config(或app.config)中保存配置設置時,我看不到Windows Azure如何更改應用程序的配置。Azure角色配置管理

例如...

常常項目將利用第三方庫,使大量使用的web.config的。 web.config的使用可能涉及連接字符串,應用程序設置或自定義配置部分。 ELMAH就是一個很好的例子。對於ELMAH web.config文件看起來像下面這樣:

<configuration> 

    <configSections> 
    <sectionGroup name="elmah"> 
     <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" /> 
     <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
    </sectionGroup> 
    </configSections> 

    <connectionStrings> 
    <add 
     name="MyElmahDatabase" 
     providerName="System.Data.SqlClient" 
     connectionString="Server=tcp:myServer.database.windows.net,1433;Database=myDB;User [email protected];Password=password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30" /> 
    </connectionStrings> 

    <elmah> 
    <security allowRemoteAccess="1" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="MyElmahDatabase" /> 
    </elmah> 

</configuration> 

有幾個問題在這裏:

  • 有沒有辦法對我來說,更新或改變遠程訪問是否啓用服務配置之間。

  • 我無法更新或更改服務配置之間的ELMAH連接字符串。

這是因爲在web.config中被打包爲是進入.cspkg文件ELMAH不會看服務配置設置(這是我可以改變服務配置之間的配置設置的唯一方法)。

我能想到的許多其他例子,其中這是一個問題......

  • 任何直接在連接字符串節觀看數據訪問框架。
  • 我需要創建的任何自定義配置設置。

...僅舉兩個例子。

我錯過了什麼,或者這是Windows Azure提供的配置管理中的一個重大缺口?

編輯

從答案,下面的評論,它看起來像這樣的東西是不能很好的支持。我認爲管理多個解決方案構建配置以支持不同的配置文件是一個非常薄弱的​​解決方案。我不應該爲我需要的每個配置文件重新構建解決方案(可能會有很多)。編譯不等於配置。

我想知道是否有辦法修改.cspkg文件,因爲它只是一個zip文件。根據this文檔,你可以在Linux上。

我看了清單中.cspkg文件,它看起來像這樣:

<PackageManifest version="2"> 
    <Encryption keytype="1" /> 
    <Contents hashtype="1"> 
    <Item name="MyApp.Web.UI_<GUID>.cssx" hash="AED69299C5F89E060876BC16BD3D6DE5130F6E62FFD2B752BAF293435339B7E2" uri="/MyApp.Web.UI_<GUID>.cssx" /> 
    <Item name="MyApp.Web.Services_<GUID>.cssx" hash="7AC81AFF642E4345173C8470C32A41118A4E3CFD4185B82D0ADA44B71057192D" uri="/MyApp.Web.Services_<GUID>.cssx" /> 
    <Item name="SMPackage_<GUID>.csmx" hash="B5E6B83B62AF64C7C11CAC1A394ABBF15D7DB7667A773C5284CE5BE95C5834E9" uri="/SMPackage_<GUID>.csmx" /> 
    <Item name="SDPackage_<GUID>.csdx" hash="F34B7C02A551D82BAD96881E2DA9447D0014D49B47CCB3840475BDC575234A7D" uri="/SDPackage_<GUID>.csdx" /> 
    <Item name="NamedStreamPackage_<GUID>.csnsx" hash="FA2B5829FF5D9B2D69DCDDB0E5BDEE6B8B0BC09FFBF37DAEEE41CF3F3F4D0132" uri="/NamedStreamPackage_<GUID>.csnsx" /> 
    </Contents> 
    <NamedStreams> 
    <Stream name="RequiredFeatures/MyApp.Web.Services/1.0" /> 
    <Stream name="RequiredFeatures/MyApp.Web.UI/1.0" /> 
    <Stream name="SupportData/MyApp.Web.Services/1.0" /> 
    <Stream name="SupportData/MyApp.Web.UI/1.0" /> 
    </NamedStreams> 
</PackageManifest> 

不幸的是,如果我重新計算不變「MyApp.Web.UI_.cssx」的哈希文件,我的散列不同於清單中的散列。從清單

哈希:AED69299C5F89E060876BC16BD3D6DE5130F6E62FFD2B752BAF293435339B7E2

我計算出的哈希:E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855

請注意,我還沒有更改的文件,所以哈希應該是相同的。

這表明我計算錯了。我的方法如下:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (FileStream fs = new FileStream(args[0], FileMode.Open)) 
     { 
      ComputeHash(new SHA256Managed(), fs); 
     } 
    } 

    private static void ComputeHash(HashAlgorithm hashAlgorithm, Stream stream) 
    { 
     byte[] hash = hashAlgorithm.ComputeHash(stream); 
     string hashString = BitConverter.ToString(hash); 
     Console.WriteLine(hashString.Replace("-", string.Empty)); 
     Console.WriteLine(); 
    } 
} 

上面的文檔鏈接,表明它是直接重新計算散列(無論在Linux上)。

有誰知道如何重新計算哈希值?

+0

可以使用.cscfg文件,爲您包的任何配置屬性得到消化。 – 2012-07-18 10:30:28

+0

這不起作用 - ELMAH(和其他框架)不會查看保存在.cscfg中的配置數據。 – 2012-07-18 14:40:26

+0

據我所知,只有可能的azure軟件包配置方法是.cscfg文件。對於像ELMAH這樣的框架,您可能需要找到一種解決方法,例如動態更改配置。但我認爲在Stackoverflow上有很多azure專家可能有更好的答案。這也是一個非常有趣和重要的問題。 – 2012-07-18 17:05:21

回答

0

我有你的web.config中的項目,你要改變它取決於它的構建方式,有一種解決方案可以在Azure之外使用。您可以使用Web.config transforms。這些轉換與您的構建配置無關,但與服務配置無關,但您的服務配置可能與您的構建配置無關(... Local.csfg - > Debug,... Cloud.csfg - > Release)。如果默認的構建配置不適合您,請創建您需要的配置。

如果你想使用每個服務配置不同的服務的定義,那麼它不是由UI支持,但您可以mess around with the build process to make it work

+0

這在技術上可行,但我必須開始維護每個環境的構建配置。此列表可能很長(開發,集成,系統測試,UAT,生產),並且每個額外的構建配置都必須構建,這會增加構建時間。我想要有一個Debug版本和一個Release版本,並且能夠將其中任何一個部署到任何環境。 – 2012-07-18 21:40:56

+0

無論您使用哪種解決方案,如果您希望針對每個環境使用不同的web.config,則無論如何都必須爲每個環境構建一個構建,因爲web.config作爲該包的一部分包含在內。包裝一旦創建就無法更改。 – knightpfhor 2012-07-19 00:21:12

+0

我不確定這是完全正確的 - 在「調試」構建配置下,我可以擁有「n」個服務配置。默認情況下,這些是「本地」和「雲」,如果我可以擁有「本地」,「雲集成」,「Cloud-SystemTest」,「Cloud-UAT」等,那將是非常好的。我可以改變配置文件爲每個這些服務配置。我不明白爲什麼我不得不重建整個解決方案來處理額外的配置文件 - 編譯不等於配置。 – 2012-07-19 15:40:42

2

傳遞相比,使用byte[]超負荷使用不同的哈希StreamComputeHash()結束。我不知道爲什麼。

試着這麼做:

private static void ComputeHash(HashAlgorithm hashAlgorithm, Stream stream) 
{ 
    BinaryReader reader = new BinaryReader(stream) 
    byte[] hash = hashAlgorithm.ComputeHash(reader.ReadBytes((int)stream.length)); 
    string hashString = BitConverter.ToString(hash); 
    Console.WriteLine(hashString.Replace("-", string.Empty)); 
    Console.WriteLine(); 
} 

這會給你,你以後的哈希值。

正如你可能已經發現了,在linux下可以用

openssl dgst -sha256 /path/to/file