5

構成設定を web.config (または app.config) に保持する以外に選択肢がない場合に、Windows 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 ID=user@myServer;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 がサービス構成設定を参照しないためです (サービス構成間で構成設定を変更できる唯一の方法です)。

これが問題である他の多くの例を考えることができます...

  • 接続文字列セクションを直接参照するデータ アクセス フレームワーク。
  • 作成する必要があるカスタム構成設定。

...2つだけ挙げます。

Windows Azure が提供する構成管理に欠けているものがありますか? それとも、これは重大なギャップですか?

編集

以下の回答とコメントから、これは十分にサポートされていないようです。さまざまな構成プロファイルをサポートするために複数のソリューション ビルド構成を管理することは、非常に弱いソリューションだと思います。必要な構成プロファイルごとにソリューションを再構築する必要はありません (かなりの数になる可能性があります)。コンパイルは構成と同じではありません。

.cspkg ファイルは単なる zip ファイルであるため、変更する方法があるかどうか疑問に思っていました。このドキュメントによると、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ではとにかく)。

ハッシュを再計算する方法を知っている人はいますか?

4

2 に答える 2

2

Streamto を渡すと、オーバーロードComputeHash()を使用する場合とは異なるハッシュにbyte[]なります。どうしてか分かりません。

次のようなものを試してください:

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
于 2013-03-27T15:32:06.077 に答える
0

ビルド方法に応じて変更したい項目が web.config にある場合、使用できる Azure の外部にあるソリューションがあります。Web.config 変換を使用できます。これらの変換は、サービス構成ではなくビルド構成に関連付けられていますが、サービス構成はビルド構成に密接に関連付けられている可能性があります (...Local.csfg -> Debug、...Cloud.csfg -> Release)。デフォルトのビルド構成がうまくいかない場合は、必要なものを作成してください。

サービス構成ごとに異なるサービス定義を使用する場合、UI ではサポートされていませんが、ビルド プロセスをいじって機能させることができます。

于 2012-07-18T19:11:30.370 に答える