2012-07-18 22 views
5

No veo cómo Windows Azure le permite variar la configuración de una aplicación cuando no tiene otra opción que mantener la configuración en web.config (o app.config).Administración de configuración de roles Azure

Por ejemplo ...

Muy a menudo los proyectos hará uso de una biblioteca tercera parte que hace un uso intensivo de web.config. El uso de web.config puede involucrar cadenas de conexión, configuración de la aplicación o secciones de configuración personalizadas. Un buen ejemplo de esto es ELMAH. Un archivo web.config de ELMAH podría ser como la siguiente:

<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> 

Hay un par de problemas aquí:

  • No hay manera para mí para actualizar o modificar si el acceso remoto está habilitado entre configuraciones de servicio.

  • No hay forma de que actualice o modifique la cadena de conexión ELMAH entre Configuraciones de servicio.

Esto se debe a que el web.config se empaqueta como es en el archivo .cspkg y ELMAH no mirará a los ajustes de configuración de servicios (que son la única manera de que pueda variar entre los valores de configuración de servicio Configuraciones).

puedo pensar en muchos otros ejemplos en los que este es un problema ...

  • Cualquier marcos de acceso a datos que se ven directamente en la sección de cadenas de conexión.
  • Cualquier configuración de configuración personalizada que necesite crear.

... para nombrar solo dos.

¿Me falta algo o es una brecha importante en la administración de la configuración que ofrece Windows Azure?

EDITAR

De la respuesta y comentarios a continuación, parece que esto es algo que no está bien sujeto. Creo que gestionar múltiples configuraciones de compilación de soluciones para soportar diferentes perfiles de configuración es una solución muy débil. No debería tener que reconstruir la solución para cada perfil de configuración que necesito (es probable que haya bastantes). La compilación no es igual a la configuración.

Me preguntaba si había una forma de modificar el archivo .cspkg ya que es solo un archivo zip. De acuerdo con la documentación this que puede en Linux.

He mirado en el manifiesto en el archivo .cspkg y se ve así:

<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> 

Por desgracia, si me re-calcular el hash de la inalterado "MyApp.Web.UI_.cssx" archivo, mi hash es diferente del que está en el manifiesto.

Hash de manifiesto: AED69299C5F89E060876BC16BD3D6DE5130F6E62FFD2B752BAF293435339B7E2

Mi hash calculado: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855

Tenga en cuenta que todavía no he cambiado el archivo, por lo que el hash debe ser el mismo.

Esto sugiere que estoy calculando mal. Mi método es el siguiente:

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(); 
    } 
} 

El enlace de la documentación anterior, sugiere que es fácil de volver a calcular el hash (en Linux de todos modos).

¿Alguien sabe cómo volver a calcular los hash?

+0

Se puede utilizar para cualquier .cscfg archivos configurables para su paquete. –

+0

Eso no funcionará - ELMAH (y otros marcos) no examinará los datos de configuración que se guardan en .cscfg. –

+0

Bueno, por lo que yo sé, solo el posible método de configuración para el paquete azul son los archivos .cscfg. Para los marcos como ELMAH, puede que tenga que encontrar una solución alternativa como cambiar la configuración de forma dinámica. Pero creo que hay muchos expertos de azul en Stackoverflow que podrían tener una respuesta mucho mejor para ofrecer. También esta es una pregunta muy interesante e importante. –

Respuesta

0

I usted tiene artículos en su web.config que usted quiere cambiar dependiendo de cómo se está construyendo, hay una solución que está fuera de Azure que puede utilizar. Puede usar Web.config transforms. Estas transformaciones están ligadas a su configuración de compilación, no a su configuración de servicio, pero sus configuraciones de servicio probablemente estén estrechamente relacionadas con sus configuraciones de compilación de todos modos (... Local.csfg -> Depurar, ... Cloud.csfg -> Versión). Si las configuraciones de compilación predeterminadas no funcionan para usted, simplemente cree las que necesita.

Si desea utilizar diferentes definiciones de servicio por configuración del servicio, entonces no es soportado por la interfaz de usuario, pero puede mess around with the build process to make it work

+0

Eso podría funcionar técnicamente, pero tendría que empezar a mantener configuraciones de compilación para cada entorno. Esta lista puede ser larga (desarrollo, integración, prueba del sistema, UAT, producción) y cada configuración de compilación adicional debe construirse, lo que aumenta el tiempo de compilación. Me gustaría tener una versión Debug y una versión Release y poder implementar cualquiera de ellas en cualquier entorno. –

+0

Independientemente de la solución que utilice, si desea un web.config diferente para cada entorno, deberá realizar una compilación por entorno de todos modos, ya que el archivo web.config se incluye como parte del paquete. El paquete no puede ser alterado una vez creado. – knightpfhor

+0

No estoy seguro de que sea del todo cierto: en la configuración de compilación "Depurar" puedo tener "n" número de configuraciones de servicio. Por defecto, estos son "Local" y "Cloud", sería genial si pudiera tener "Local", "Cloud-Integration", "Cloud-SystemTest", "Cloud-UAT" etc. Y que podría variar los archivos de configuración para cada una de esas configuraciones de servicio.No veo por qué debería tener que reconstruir toda la solución solo para hacer frente a los perfiles de configuración adicionales; la compilación no es igual a la configuración. –

2

Pasar un Stream a ComputeHash() termina con un hash diferente en comparación con el uso de la sobrecarga byte[] . No sé por qué.

Pruebe algo como:

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(); 
} 

Esto le dará el hash que está buscando.

Como probablemente ya has descubierto, en Linux se puede obtener el producto de digestión con

openssl dgst -sha256 /path/to/file 
Cuestiones relacionadas